2011-03-01 58 views
3

因此,這裏是起點我可以在這裏避免使用遊標嗎?

CREATE TABLE #Data ( 
    ID  INT IDENTITY(1,1), 
    MyData VARCHAR(200) 
) 

INSERT INTO #Data (Data) VALUES ('Test123, Test678') 
INSERT INTO #Data (Data) VALUES ('abcd, efgh, mnop') 

我想從解析邁德特列逗號分隔的數據,並將其回相關的ID相關聯。所以最終的結果將是

ID ParsedData 
-------------- 
1 Test123 
1 Test678 
2 abcd 
2 efgh 
2 mnop 

我可以通過遊標做到這一點,但要避免它。有沒有更好的方式來爲它編寫查詢?

+0

使用'CROSS APPLY'和一個分開的TVF或加入到一張理貨桌上。這裏的示例http://stackoverflow.com/questions/4992419/group-by-sql-query-on-comma-joined-column – 2011-03-01 15:59:43

+2

不要把逗號分隔的數據放在sql服務器列首先。你可以做的事情很少。 – 2011-03-01 16:08:01

+0

@Joel:這是一些外部數據,這就是他們將它發送給我的方式。 – 2011-03-01 16:11:16

回答

2

這樣做的最佳方式是much controversy的主題,也取決於字符串的長度,分隔符的頻率,併發使用情況,並行計劃的適用性,結果是否將在JOIN操作中使用...

Erland Sommarskog does some performance tests here

我已經鏈接到Adam Machanic的TSQL拆分函數,該函數使用數字表。上面的鏈接中有更多的負載。

1. Create a numbers table

2. Create a split function

SELECT ID,OutParam 
FROM #Data 
CROSS APPLY dbo.SplitString(MyData,',') 
0

您是否打開更改proc的輸入?如果是這樣,你可以使用自定義的用戶定義的表類型;

CREATE TYPE [dbo].[SomeInfo] AS TABLE(
[Id] [int] NOT NULL, 
[SomeValue] [int] NOT NULL) 

定義你的存儲過程,

CREATE PROCEDURE [dbo].[AddSomeStuff] 
    @theStuff [SomeInfo] READONLY 
AS 
BEGIN 
    INSERT INTO SOMETABLE ([...columns...]) 
    SELECT [...columns...] from @theStuff 
END 

如果您需要從.NET你需要創建一個DataTable(稱爲見下表)調用它相匹配的模式,並調用存儲過程是如此;

var cmd = new SqlCommand("AddSomeStuff", sqlConn) {CommandType = CommandType.StoredProcedure}; 

var param = new SqlParameter("@theStuff", SqlDbType.Structured) {Value = table}; 
cmd.Parameters.Add(param); 

cmd.ExecuteNonQuery(); 
+0

什麼程序輸入什麼? – 2011-03-01 15:58:22

+1

我完全失去了你的答案如何幫助解決我所問的問題。你能詳細說明嗎? – 2011-03-01 16:16:08

+0

這個想法是,你不再在一個變量中傳遞逗號分隔的信息,而是將數據作爲表結構傳遞,避免了整個解析問題。 – 2011-03-01 16:32:42

0

在SQL Server 2005和了,你可避免光標 - 但這種拆分逗號分隔字符串轉換成有用的東西永遠是一個迭代的過程。

有幾種方法和存儲函數可以分割一個字符串並返回一個值表。使用one of those function,然後你可以編寫類似:

SELECT 
d.ID, Value 
FROM 
#Data AS d 
CROSS APPLY 
[dbo].[SplitDelimited](d.MyData, ',') 

,你會得到一個輸出類似:

ID Value 
1 Test123 
1 Test678 
2 abcd 
2 efgh 
2 mnop 
相關問題