C# で SQL Server ストアド プロシージャにリストを渡す
質問:
文字列のリストを C# コードから SQL Server ストアド プロシージャに渡す必要があります。ただし、このリストは動的であり、数百の項目が含まれています。
解決策:
ユーザー定義のテーブル タイプ (UDTT) を使用する
SQL Server 2008 以降ではユーザー定義テーブル型 (UDTT) が提供されており、ストアド プロシージャで使用するカスタム データ型を作成できます。次の手順に従ってください:
<code class="language-sql">CREATE TYPE [dbo].[StringList] AS TABLE( [Item] [NVARCHAR](MAX) NULL );</code>
<code class="language-sql">CREATE PROCEDURE [dbo].[sp_UseStringList] @list StringList READONLY AS BEGIN -- 只返回我们传入的项目 SELECT l.Item FROM @list l; END</code>
<code class="language-csharp">using (var table = new DataTable()) { table.Columns.Add("Item", typeof(string)); for (int i = 0; i < 1000; i++) // 假设列表包含1000个项目 { table.Rows.Add("Item " + i); } }</code>
<code class="language-csharp">var pList = new SqlParameter("@list", SqlDbType.Structured); pList.TypeName = "dbo.StringList"; pList.Value = table;</code>
<code class="language-csharp">using (var con = new SqlConnection(connstring)) { con.Open(); using (SqlCommand cmd = new SqlCommand("exec sp_UseStringList @list", con)) { cmd.Parameters.Add(pList); using (var dr = cmd.ExecuteReader()) { while (dr.Read()) Console.WriteLine(dr["Item"].ToString()); } } }</code>
connstring
を独自の接続文字列に置き換えてください。 このコード例では、リストに 1000 個の項目が含まれていることを前提としているため、実際のリストのサイズに基づいてループを調整する必要があります。 さらに、SQL Server インスタンスで READONLY
パラメーターの使用が有効になっていることを確認してください。
以上がC# 文字列リストを SQL Server ストアド プロシージャに渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。