2012-06-08 44 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; 

在这两种情况下,都不需要临时表或表变量。