Ahora con la aparición de los parámetros tipo tabla en SqlServer, se elimina la necesidad de crear parametros complejos o de trucos para enviar información hacia los procedimientos almacenados, pero para quienes no quieren enviar esta información, crear los tipos de datos que se requieren para recibir los parámetros tipo tabla, presento una alternativa para ello en varias aproximaciones
Función de usuario para la generación de Tablas
--USO: select * from fnCSV2Table('1,2,3,4,5,6,7,8',default)
--Convierte una CSV a una tabla, lo que facilita las consultas
--Reduce la necesidad de consultas dinámicas dentro de los procedimientos almacenados
create function fnCSV2Table(@CSV varchar(max), @Separator char(1) = ',')
returns @list table (data int)
as
Begin
declare @SecondIndex int
declare @FirtsIndex int
set @SecondIndex = charindex(@Separator,@CSV)
set @FirtsIndex = 0
if @SecondIndex > 0 set @CSV = @CSV + @Separator
while (@SecondIndex > 0)
Begin
insert into @list values(substring(@CSV,@FirtsIndex,@SecondIndex - @FirtsIndex))
set @FirtsIndex = @SecondIndex + 1
set @SecondIndex = charindex(@Separator,@CSV,@FirtsIndex)
End
if @FirtsIndex =0 and len(@CSV)>0
insert into @list values(@CSV)
return
End
go
--USO: select * from fnConvertCSV2TextTable('1,2,3,4,5,6,7,8',default)
--Convierte una CSV a una tabla (tipo texto), lo que facilita las consultas
--Reduce la necesidad de consultas dinámicas dentro de los procedimientos almacenados
create function fnConvertCSV2TextTable(@CSV varchar(max), @Separator char(1) = ',')
returns @list table (data varchar(8000))
with encryption
as
Begin
declare @SecondIndex int
declare @FirtsIndex int
set @SecondIndex = charindex(@Separator,@CSV)
set @FirtsIndex = 0
if @SecondIndex > 0 set @CSV = @CSV + @Separator
while (@SecondIndex > 0)
Begin
insert into @list values(substring(@CSV,@FirtsIndex,@SecondIndex - @FirtsIndex))
set @FirtsIndex = @SecondIndex + 1
set @SecondIndex = charindex(@Separator,@CSV,@FirtsIndex)
End
if @FirtsIndex =0 and len(@CSV)>0
insert into @list values(@CSV)
return
End
go
Es posible que no sea la aproximación mas óptimizada desde el punto de vista programación T-Sql, pero si es seguro, soluciona el problema de una manera simple y facil de administrar
Cómo Usuarla
Una vez convertida a tabla podemos usarla en un join para filtrar los datos que queremos consultar, podemos usar Cross Apply para aplicar a cada registro la función, etc., la idea es generar una tabla y poderla utilizar facilmente dentro de nuestro código
FREDDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP
En un artículo anterior, [Code] Crear una tabla a partir de un texto separado por comas (CSV)