SQL Server, busqueda en las tablas evitando SQL Injection

11 09 2009

Les paso a comentar una forma de realizar búsquedas en nuestras tablas, sin usar nuestro querido LIKE, quien si no está correctamente aplicado en nuestros proyectos puede llegar a traernos problemas de performance y de SQL Injection.

En primera instancia puede parecer complicado, pero les puedo asegurar que no lo es.  Solo hay que habilitar la indización a la base de datos (haciendo un click en un check), luego a la tabla, y a través de un asistente se le indica cuales son los campos de la tabla que se van a indexar. Muy simple, performante, y sobre todo seguro.

Para habilitar una base de datos para la indización de texto:
  1. En el Explorador de objetos, expanda el grupo de servidores, haga clic con el botón secundario en la base de datos para la que desea habilitar la indización de texto y, a continuación, seleccione Propiedades.
  2. Seleccione la página Archivos y, a continuación, Usar indización de texto.

Lo que vamos a hacer es habilitar la indización de texto, para esto hay que hacer los siguientes pasos:

  1. Expanda el grupo de servidores, expanda Bases de datos, luego Bases de datos de usuario y, a continuación, expanda la base de datos que contiene la tabla que desea habilitar para la indización de texto.
  2. Haga clic con el botón secundario en la tabla que desea habilitar para la indización de texto.
  3. Seleccione Índice de texto y, a continuación, haga clic en Habilitar indización de texto.

Para iniciar el asistente de indización de texto:

  1. En el Explorador de objetos, haga clic con el botón secundario en la tabla en la que desea crear un índice de texto y, a continuación, seleccione Índice de texto.
  2. Seleccione Definir índice de texto.

Un ejemplo de como sería nuestra consulta:

     SELECT Name, Color FROM Production.Product
     WHERE CONTAINS((Name, Color), 'Red');
     SELECT Title
     FROM Production.Document
     WHERE FREETEXT (Document, 'vital safety components' );

Fuentes:
http://technet.microsoft.com/es-es/library/ms403375%28SQL.90%29.aspx
http://technet.microsoft.com/es-es/library/ms142536%28SQL.90%29.aspx
http://technet.microsoft.com/es-es/library/aa337082%28SQL.90%29.aspx
http://msdn.microsoft.com/en-us/library/ms142488.aspx
http://msdn.microsoft.com/en-us/library/ms142583.aspx





Split & Reversa de Split en SQL SERVER

1 09 2009

Les dejo unas funciones que me parecieron más que útiles. 1° es una función de split, lo cual permite pasarle un string ej. ’1234,4567,890′ y te devuelve un valor por fila en una tabla. 2° es la función inversa lo cual permite a partir de los valores de una tabla concatenarlos quedando un solo string.

A partir de la utilización de esto, me permitió reducir una enorme cantidad de consultas a la base, dado que en vez de pasarle un “id” en cada consulta para chequearlo, le paso el listado de “ids” concatenados lo cual en una sola conexión a la base ya le pase todos, quedando en manos del SQL para hacer el correspondiente chequeo (en mi caso).

Función SPLIT

ALTER FUNCTION [dbo].[fnSplit](
@sInputList VARCHAR(8000) — List of delimited items
, @sDelimiter VARCHAR(8000) = ‘,’ — delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
SELECT
@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END

IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList — Put the last item in
RETURN
END

Llamando la función

SELECT * FROM dbo.fnSplit(’1234,4567,890′,’,') AS List

Reversa del SPLIT

Animal
Llama
Manatee
Pygmy Marmoset
Okapi

Result CSV: “Llama, Manatee, Pygmy Marmoset, Okapi”

select Name from Animal

declare @csv varchar(max)
select @csv = coalesce(@csv + ‘, ‘, ”) + Name from Animal
select @csv








Seguir

Get every new post delivered to your Inbox.