18/04/2006, 14:37
|
| Colaborador | | Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 8 meses Puntos: 25 | |
Una variante que te permite no usar código dinámico es convertir los valores a una tabla temporal o en memoria y sobre esa hacer un join con el resto del query.
De esa manera que quitas de los problemas del SQL dinámico. Este es el código que yo manejo, basado de un código de la red (seguramente de sqlservercentral.com) y con adaptaciones mías:
Código:
CREATE FUNCTION dbo.fnStringListToTable (@stringlist ntext)
RETURNS @tbl TABLE (
row_no int IDENTITY(1, 1) NOT NULL,
number_int int NOT NULL,
number_decimal decimal(15,5),
string nvarchar(100) NOT NULL
) AS
/*
fnStringListToTable
Regresa una tabla en memoria a partir de la cadena separada por
espacios que se pasa como parametro.
*/
BEGIN
DECLARE @pos int,
@textpos int,
@chunklen smallint,
@int_val int,
@dec_val decimal(15,5),
@str_val nvarchar(4000),
@tmpstr nvarchar(4000),
@leftover nvarchar(4000)
SET @textpos = 1
SET @leftover = ''
WHILE @textpos <= datalength(@stringlist) / 2
BEGIN
SET @chunklen = 4000 - datalength(@leftover) / 2
SET @tmpstr = ltrim(@leftover + substring(@stringlist, @textpos, @chunklen))
SET @textpos = @textpos + @chunklen
SET @pos = charindex('@', @tmpstr) --"@" es el separador de cadena
WHILE @pos > 0
BEGIN
SET @str_val = substring(@tmpstr, 1, @pos - 1)
SET @int_val = CASE WHEN dbo.fnIsNumeric(@str_val) = 1 THEN CONVERT(int, CONVERT(float, @str_val)) ELSE 0 END
SET @dec_val = CASE WHEN dbo.fnIsNumeric(@str_val) = 1 THEN CONVERT(decimal(15,5), @str_val) ELSE 0 END
INSERT @tbl (number_int, number_decimal, string) VALUES(@int_val, @dec_val, @str_val)
SET @tmpstr = ltrim(substring(@tmpstr, @pos + 1, len(@tmpstr)))
SET @pos = charindex('@', @tmpstr)
END
SET @leftover = @tmpstr
END
IF ltrim(rtrim(@leftover)) <> ''
INSERT @tbl (number_int, number_decimal) VALUES(convert(int, @leftover), convert(decimal(15,5), @leftover))
RETURN
END
__________________ "El hombre, en su orgullo, creó a Dios a su imagen y semejanza."Friedrich Nietzsche |