Necesita una forma de dividir y procesar la cadena en TSQL, hay muchas maneras de hacerlo. Este artículo cubre los pros y los contras de casi todos los métodos:
"Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Cut it" by Erland Sommarskog
Es necesario crear una función de división. Se trata de cómo se puede utilizar una función de división:
SELECT
*
FROM YourTable y
INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
I prefer the number table approach to split a string in TSQL pero hay numerosas maneras de dividir cadenas en SQL Server, consulte el enlace anterior, lo que explica las ventajas y desventajas de cada uno.
Para el método Números mesa de trabajo, lo que necesita hacer esta configuración de la tabla una vez, lo que creará una mesa Numbers
que contiene filas de 1 a 10.000:
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO Numbers
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
Una vez que la tabla Números está configurado , cree esta función dividida:
CREATE FUNCTION [dbo].[FN_ListToTableRows]
(
@SplitOn char(1) --REQUIRED, the character to split the @List string on
,@List varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN
(
----------------
--SINGLE QUERY-- --this will return empty rows, and row numbers
----------------
SELECT
ROW_NUMBER() OVER(ORDER BY number) AS RowNumber
,LTRIM(RTRIM(SUBSTRING(ListValue, number+1, CHARINDEX(@SplitOn, ListValue, number+1)-number - 1))) AS ListValue
FROM (
SELECT @SplitOn + @List + @SplitOn AS ListValue
) AS InnerQuery
INNER JOIN Numbers n ON n.Number < LEN(InnerQuery.ListValue)
WHERE SUBSTRING(ListValue, number, 1) = @SplitOn
);
GO
Ahora puede dividir fácilmente una cadena CSV en una tabla y unirla. Para llevar a cabo su tarea, SIF puede pasar en dos parámetros, una de las claves de uno de los valores, a continuación, crear un procedimiento como éste:
CREATE PROCEDURE StoredProcedureName
(
@Params1 int
,@Array1 varchar(8000)
,@Params2 int
,@Array2 varchar(8000)
)
AS
DECLARE @YourTable table (col1 int, col2 int)
INSERT INTO @YourTable
(col1, col2)
SELECT
a1.ListValue, a2.ListValue
FROM dbo.FN_ListToTableRows(',',@Array1) a1
INNER JOIN dbo.FN_ListToTableRows(',',@Array2) a2 ON a1.RowNumber=a2.RowNumber
select * from @YourTable
GO
probarlo:
exec StoredProcedureName 17,'127,204,110,198',7,'162,170,163,170'
SALIDA:
(4 row(s) affected)
col1 col2
----------- -----------
127 162
204 170
110 163
198 170
(4 row(s) affected)
o si desea pasar de un solo parámetro valor de la clave par el uso algo como esto:
CREATE PROCEDURE StoredProcedureName
(
@KeyValueList varchar(8000)
)
AS
DECLARE @YourTable table (RowKey varchar(500), RowValue varchar(500))
INSERT INTO @YourTable
(RowKey, RowValue)
SELECT
LEFT(y.ListValue,CHARINDEX(',',y.ListValue)-1),RIGHT(y.ListValue,LEN(y.ListValue)-CHARINDEX(',',y.ListValue))
FROM dbo.FN_ListToTableRows(';',@KeyValueList) y
SELECT * FROM @YourTable
GO
plazo es:
exec StoredProcedureName 'a,5;b,BBB;abc,xyz'
SALIDA:
RowKey RowValue
------- -----------
a 5
b BBB
abc xyz
(3 row(s) affected)
¿Puedes elaborar? – roosteronacid