C# 拆分字符串或XML以向存储过程发送ID?

C# 拆分字符串或XML以向存储过程发送ID?,c#,sql-server-2008,sql-server-2005,C#,Sql Server 2008,Sql Server 2005,我在C#中有一个应用程序,必须向SQL Server中的数据库发送一个ID列表(int)以进行几个连接。我有内存数据集中的ID列表 我知道两种方法:一种是创建一个id由管道分隔的字符串,然后在sql中拆分它们,将它们插入临时表中。然后我可以做我想要的连接 另一种方法是对我的数据集执行“getXML”,并发送它。然后,我可以在临时表中插入信息,并执行我想要的连接 哪条路更好,为什么?还是另一个比两者都好的选择 使用SQL Server 2005和SQL Server 2008、Visual Stu

我在C#中有一个应用程序,必须向SQL Server中的数据库发送一个ID列表(int)以进行几个连接。我有内存数据集中的ID列表

我知道两种方法:一种是创建一个id由管道分隔的字符串,然后在sql中拆分它们,将它们插入临时表中。然后我可以做我想要的连接

另一种方法是对我的数据集执行“getXML”,并发送它。然后,我可以在临时表中插入信息,并执行我想要的连接

哪条路更好,为什么?还是另一个比两者都好的选择


使用SQL Server 2005和SQL Server 2008、Visual Studio 2010,要传递的ID数是可变的。

我认为XML更好,因为它更健壮。它是自文档化的,您不必担心分隔符,甚至可以根据XSD验证XML。如果数据包含分隔符和其他异常字符,则使用分隔字符串可以处理它。解析是可行的,但最好不必重新发明轮子,尤其是对于已经非常有效的东西


这是一个让你行动起来的方法。您的概念证明可能更简单。

在SQL Server 2008中,还有另一种方法:将您的ID作为身份证传递。

我同意Paul的观点,在这里使用标准格式会更好。不过,如果你能用一种更高效的格式,比如JSON,那就更好了。JSON比XML更小,解析速度通常更快

最好是SQL Server具有本机支持。然而,这并不一定要阻止你。如果效率很关键,那么看看这个。。。
我建议使用CLR表值函数。处理整数不需要太多时间

那么你可以说:

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

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

在我的工作中,我的老板想要拆分,我想要使用XML。我问朋友,他说xml更难检查是否有问题,而在旧版本的sql server中可能不起作用,使用拆分字符串更容易。我倾向于使用XML,但我不知道如何反驳我的朋友们的观点。创建一个读取XML并对其进行操作的进程。代码将显示这将是一个比解析文本更干净的过程。要做到这一点,你甚至不用写C。只需在T-SQL语句中创建一个示例XML文档即可运行测试。@Elviejo SQL Server 6.5(大约在90年代中后期)是不支持XML的最后一个版本。你真的担心回去那么远吗?我不知道!!所以,我的朋友骗我说SQLServer2005不太支持XML。谢谢(不得不说,我不敢相信我会相信他)我建议你用谷歌搜索“t-sql分割字符串”,复制你找到的最简单的算法,并把它展示给你的老板。当他看到在T-SQL中拆分字符串不像在C#中那样是一个简单的操作时,他可能会同意你的XML方法。这是一个不错的选择,但我的应用程序被两个客户端使用:一个客户端使用SQL server 2008,另一个客户端使用SQL server 2005效率并不重要,它是一个简单的报告站点,但知道这一点很有趣。谢谢
SELECT t.Columns
  FROM dbo.YourTable AS t
  INNER JOIN dbo.SplitInts(@IntegerList) AS f
  ON t.ColumnName = f.Item;