0

特定のテーブルを更新するために、20k ID の配列をストアド プロシージャ パラメータに渡したいと考えています。

20k の更新クエリを個別に実行する代わりに、1 つのクエリを実行してすべてを更新したいので、パフォーマンスが向上するはずです。

ストアド プロシージャにパラメーターを渡すことができることを知っている人はいますか?

NVARCHAR(MAX) が 8000 文字に制限されていることは理解しましたが、ストアド プロシージャ パラメータを使用してそのような巨大なデータを送信することはまったく可能ですか?

4

1 に答える 1

1

代わりにテーブル値パラメータを使用してください。テーブル値パラメーターの使用(データベースエンジン)を参照してください。TVPは、その名前が示すとおり、テーブルであるパラメーターです。クライアントコードからDataTableを割り当てると、プロシージャ(またはアドホックSQL codE)がDataTable全体をパラメータとして受け取ります。これはMSDNでコピーされた例です。

// Assumes connection is an open SqlConnection.
using (connection)
{
// Create a DataTable with the modified rows.
DataTable addedCategories = CategoriesDataTable.GetChanges(
    DataRowState.Added);

// Define the INSERT-SELECT statement.
string sqlInsert = 
    "INSERT INTO dbo.Categories (CategoryID, CategoryName)"
    + " SELECT nc.CategoryID, nc.CategoryName"
    + " FROM @tvpNewCategories AS nc;"

// Configure the command and parameter.
SqlCommand insertCommand = new SqlCommand(
    sqlInsert, connection);
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
    "@tvpNewCategories", addedCategories);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.CategoryTableType";

// Execute the command.
insertCommand.ExecuteNonQuery();
}
于 2012-09-06T21:25:56.917 に答える