拆分字符串或 XML 以将 ID 发送到存储过程

本文关键字:存储过程 ID 以将 字符串 XML 拆分 | 更新日期: 2023-09-27 18:36:32

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

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

另一种方法是将"getXML"发送到我的数据集,并将其发送。然后,我可以在临时表中插入信息,并执行所需的联接。

哪种方式更好,为什么?还是另一种选择比两者都好?

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

拆分字符串或 XML 以将 ID 发送到存储过程

我认为XML更好,因为它更健壮。它是自我记录的,您不必担心分隔符,您甚至可以根据 XSD 验证 XML。使用分隔字符串,如果数据包含分隔符和其他变幻莫测,则需要处理它。解析是可行的,但最好不必重新发明轮子,特别是对于已经运行良好的东西。

这是来自Pinal Dave的一个漂亮而整洁的样本,可以让你继续前进。您的概念验证可能更简单。

在 SQL Server 2008 中,还有另一种方法:将 id 作为表值参数传递。

我同意保罗的观点,在这里使用标准格式会很好。 虽然,如果你能用像 JSON 这样更有效的格式来做到这一点会更好。 JSON 比 XML 更小,解析速度通常更快。

如果SQL Server对它有本机支持,那将是最好的。 但是,这不一定会阻止您。 如果效率至关重要,那么请查看此内容...http://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-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

并做同样的事情...

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

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