2012-06-08 71 views
3

我在C#中有一個應用程序,並且必須向SQL Server中的數據庫發送一個ID列表(int)來創建幾個連接。我在內存中的數據集中有ID列表。拆分字符串或XML將ID發送到存儲過程?

我知道兩種方法來做到這一點:一是創建一個字符串與ID分隔的管道,並將其拆分在SQL中,將它們插入臨時表中。然後我可以做我想要的連接。

另一種方法是對我的數據集執行「getXML」併發送它。然後,我可以將信息插入臨時表中,並執行我想要的聯接。

哪種方式更好,爲什麼?或者比這兩個選項更好?

ID的數傳是可變的,使用SQL Server 2005和SQL Server 2008,Visual Studio 2010中

回答

4

我認爲XML是更好,因爲它更強勁。它是自我記錄的,您不必擔心分隔符,甚至可以驗證針對XSD的XML。如果你的數據包含你的分隔符和其他變異,你可以使用分隔字符串來處理它。解析是可行的,但最好不必重新發明輪子,尤其是對於已經非常好的工作。

這是nice and tidy sample from Pinal Dave讓你走。你的概念證明可能更簡單。

+0

在我的工作中,我的老闆想要拆分,我想使用XML。我向朋友詢問,他說xml更難以檢查是否無法正常工作,並且在舊版本的sql server中可能無法正常工作,對拆分字符串更容易。我爲你說的先行XML,但我不知道如何與我的朋友辯論 –

+2

證明了這個概念。創建一個讀取XML並對其進行操作的過程。該代碼將表明它將比解析文本更清潔。你甚至不需要編寫C#來做到這一點。只需在T-SQL語句中創建一個示例XML文檔即可運行測試。 –

+0

@ElVieejo SQL Server 6.5(大約90年代中後期)是最後一個不支持XML的版本。你真的擔心回到那麼遠嗎? –

1

在SQL Server 2008中,還有另一種方法:將您的ID作爲table value parameters

+0

OP也需要這個工作在SQL Server 2005上。 –

+0

是一個不錯的選擇,但是我的應用程序被兩個客戶端使用:其中一個有sql server 2008,另一個使用sql server 2005 –

1

我同意Paul的說法,在這裏使用標準格式會很好。儘管如果你可以用像JSON這樣更高效的格式來做到這一點會更好。 JSON比XML更小,通常解析速度更快。

這是最好的,如果SQL Server有原生支持它。但是,這並不一定要阻止你。如果效率很關鍵,那麼檢查一下... http://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/

+0

效率不是關鍵,它是一個簡單的報告網站,但知道這一點很有趣。謝謝! –

1

我會推薦一個CLR表值函數。代替convert this function來處理整數不應該太多。

然後,你可以說:

SELECT t.Columns 
    FROM dbo.YourTable AS t 
    INNER JOIN dbo.CLRFunctionName(@IntegerList) AS f 
    ON t.ColumnName = f.Item; 

對於XML(在你無法實現CLR的情況下),你可以這樣做:

CREATE FUNCTION [dbo].[SplitInts] 
(
    @List  VARCHAR(MAX), 
    @Delimiter CHAR(1) 
) 
RETURNS TABLE 
AS 
    RETURN (SELECT Item FROM (SELECT Item = x.i.value('(./text())[1]', 'int') FROM 
      (SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>') 
       + '</i>').query('.')) AS a CROSS APPLY [XML].nodes('i') AS x(i) 
     ) AS y WHERE Item IS NOT NULL 
    ); 
GO 

,做同樣的事情。 ...

SELECT t.Columns 
    FROM dbo.YourTable AS t 
    INNER JOIN dbo.SplitInts(@IntegerList) AS f 
    ON t.ColumnName = f.Item; 

在這兩種情況下,都不需要臨時表或表變量。