2010-08-24 18 views

Respuesta

6

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) 
5

formato de este Diccionario en un XML y pasar esto a SQL Server. Comprende el tipo de datos XML y puede consultarlo.

<Data> 
    <Entry Key="1" Value="One" /> 
    <Entry Key="2" Value="Two" /> 
</Data> 

y pasar esto como SqlDataType.Xml. SQL 2005 y posterior puede realizar consultas desde XML. Hay muchos ejemplos de cómo trabajar con XML en SQL Server.

+3

¿Puedes elaborar? – roosteronacid

Cuestiones relacionadas