3

文字列リストがあり、リスト内の値のいずれかがデータベーステーブルに含まれているかどうかを確認する必要があります。存在する場合は、既存の値のデータセットを返します。

public DataSet CheckDocumentNumber(List<string> DocNumber)
{
   DataSet DocNum = new DataSet();
   SqlTransaction transaction = DALDBConnection.SqlConnection.BeginTransaction();

   try
   {
      string[] taleNames = new string[1];
      taleNames[0] = "DocNum";
      SqlParameter[] param = new SqlParameter[1];
      param[0] = new SqlParameter("@DocNumber", DocNumber);

      SqlHelper.FillDataset(transaction, CommandType.StoredProcedure, "spCheckDocNumber", DocNum, taleNames, param);
      transaction.Commit();
   }
   catch (Exception e)
   {
      transaction.Rollback();
   }

   return DocNum;
}

私のストアドプロシージャは

CREATE PROCEDURE spCheckDocNumber
    @DocNumber VARCHAR(MAX)
AS
BEGIN
   SELECT * FROM tblDocumentHeader WHERE DocumentNumber = @DocNumber
END

リストをストアドプロシージャに渡す方法と、プロシージャでリストを確認する方法を知っておく必要があります。plzヘルプ

4

5 に答える 5

6

文字に基づいて文字列を分割するSplit関数を作成します。

GO
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
    WITH splitter_cte AS (
      SELECT CHARINDEX(@sep, @s) as pos, 0 as lastPos
      UNION ALL
      SELECT CHARINDEX(@sep, @s, pos + 1), pos
      FROM splitter_cte
      WHERE pos > 0
    )
    SELECT SUBSTRING(@s, lastPos + 1,
                     case when pos = 0 then 80000
                     else pos - lastPos -1 end) as chunk
    FROM splitter_cte
  )
GO

SELECT *
  FROM dbo.Split(' ', 'the quick brown dog jumped over the lazy fox')
OPTION(MAXRECURSION 0);

次に、Split関数を使用してコンマを区切ります。次に、出力をテーブルとして使用し、探しているテーブルと結合します。

これにより、コンマ区切りのリストを非常に簡単に分割できます。次に、すべてのhte値をコンマで区切った文字列を渡すことができます。

お役に立てれば!

于 2012-04-09T15:40:29.350 に答える
1

次のようなコードを使用できます。これはSQLServer2005(およびそれ以降)で機能します。

create procedure IGetAListOfStrings
@List xml -- This will recevie a List of values
  as
begin
  -- You can load then in a temp table or use it as a subquery:
  create table #Values (ListValue nvarchar(20)); -- adjust nvarchar size
  INSERT INTO #Values
  SELECT DISTINCT params.p.value('.','varchar(20)') -- adjust nvarchar size
  FROM @List.nodes('/params/p') as params(p);
  ...
end

次のようなパラメータを使用して、このプロシージャを呼び出す必要があります。

exec IGetAListOfValues
@List = '<params> <p>string1</p> <p>string2</p> </params>' -- xml parameter

ノード関数はxPath式を使用します。この場合、/params/pXMLが<params>ルートおよび<p>要素として使用するようになっています。

詳細については、次の回答を参照してください: ストアドプロシージャへの値のリストの受け渡し

于 2012-04-09T17:04:26.007 に答える
0

代わりに、SQLでIn演算子を使用できます。http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htmにも、これを使用する方法に関するチュートリアルがいくつかあります。

于 2012-04-09T14:42:33.200 に答える
0

自分でコーディングする必要があります。xmlsqlデータ型を使用することをお勧めします。

参照:コードサンプルのストアドプロシージャにパラメータの配列を渡す。

于 2012-04-09T14:43:14.557 に答える
0

XMLをSQLに送信する

            List<string> lst = new List<string> {
                                                        "1",
                                                        "2",
                                                        "3"
                                                };

            XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
            namespaces.Add(string.Empty, string.Empty);
            StringBuilder sb = new StringBuilder();
            using (var sw = new StringWriter(sb)) //serialize
            {
                var serializer = new XmlSerializer(typeof (List<string>));
                serializer.Serialize(sw, lst, namespaces);
            }

ここで、SBをparamとしてsqlに送信します。

それで全部です。

CSVを使用しないでください。

于 2012-04-09T14:49:31.313 に答える