2010-08-24 211 views

回答

6

你需要一種方法來分割和處理TSQL中的字符串,有很多方法可以做到這一點。本文介紹了幾乎每一個方法的優點和缺點:

"Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Cut it" by Erland Sommarskog

你需要創建一個分裂的功能。這是一個分裂的功能如何使用:

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但也有許多方法來拆分在SQL Server中的字符串,見前面的鏈接,這說明各的優點和缺點。

對於數字表的方法來工作,你需要做的這一次表的設置,這將創建一個包含從1到10000行的表Numbers

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) 

一旦Numbers表格設置,創建此分割功能:

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 

您現在可以輕鬆地將CSV字符串拆分爲表格並加入其中。爲了完成你的任務,SIF可以在兩個參數,鍵的值之一的一個傳球,然後創建一個這樣的過程:

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 

測試出來:

exec StoredProcedureName 17,'127,204,110,198',7,'162,170,163,170' 

OUTPUT:

(4 row(s) affected) 
col1  col2 
----------- ----------- 
127   162 
204   170 
110   163 
198   170 

(4 row(s) affected) 

,或者如果你想在一個單一的參數鍵值對使用這樣的事情經過:

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 

運行:

exec StoredProcedureName 'a,5;b,BBB;abc,xyz' 

OUTPUT:

RowKey RowValue 
------- ----------- 
a  5 
b  BBB 
abc  xyz 

(3 row(s) affected) 
5

格式此解釋爲XML,並在通過這個到SQL Server。它理解XML數據類型並可以查詢它。

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

並將其作爲SqlDataType.Xml傳遞。 SQL 2005和更高版本能夠從XML進行查詢。有很多關於如何在SQL Server中使用XML的例子。

+3

你能詳細說一下嗎? – roosteronacid 2010-08-24 14:50:37

相關問題