3

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

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

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

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

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

4

4 回答 4

4

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

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

于 2012-06-08T18:07:54.370 回答
1

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

于 2012-06-08T18:15:23.687 回答
1

我同意 Paul 的观点,在这里使用标准格式会很好。不过,如果您可以使用更高效的格式(如 JSON)来做到这一点,那就更好了。JSON 比 XML 更小,解析速度通常更快。

如果 SQL Server 对它有本机支持,那将是最好的。然而,这并不一定要阻止你。如果效率很关键,请检查一下... http://www.simple-talk.com/sql/t-sql-programming/sumption-json-strings-in-sql-server/

于 2012-06-08T18:23:20.097 回答
1

我会推荐一个 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;

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

于 2012-06-08T18:28:20.617 回答