3

C#でアプリケーションを使用しており、IDのリスト(int)をSQL Serverのデータベースに送信して、いくつかの結合を行う必要があります。メモリ上のデータセットにIDのリストがあります。

私はそれを行う2つの方法を知っています。1つは、パイプで区切られたIDで文字列を作成し、それらをsqlで分割して、一時テーブルに挿入することです。次に、必要な結合を実行できます。

もう1つの方法は、データセットに「getXML」を実行して送信することです。次に、一時テーブルに情報を挿入し、必要な結合を実行できます。

どちらが良いのか、そしてその理由は?または両方よりも優れた別のオプション?

渡すIDの数は、SQLServer2005およびSQLServer2008、VisualStudio2010を使用して可変です。

4

4 に答える 4

4

XMLの方が堅牢なので、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/using-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 に答える