3

T-sql データベース (ストアド プロシージャではない) で呼び出そうとする C# の文字列として記述されたクエリがあります。渡す必要があるパラメーターの 1 つは、GUID のリストです。これには、テーブル値パラメーターを使用しようとしています。クエリの一部で動的なテーブル名が必要な場合、ストアド プロシージャはデバッグにはやや扱いにくいと考えられます。クエリの最後の部分では、テーブルの ID を、渡す Guid のリストに結合します。

コマンドにパラメーターを追加する

var ListOfIDs = new DataTable();
    ListOfIDs.Columns.Add("ID", typeof (Guid));
    selectedIDs.ForEach(x=> ListOfIDs.Rows.Add(x));

cmd.Parameters.Add(new SqlParameter("@ListOfIDs", SqlDbType.Udt)
{
   Value = ListOfIDs, UdtTypeName = "ListOfGuids"
});

私のテーブル

CREATE TYPE [dbo].[ListOfGuids] AS TABLE(
    [ID] [uniqueidentifier] NULL
)

行を実行すると:

var reader = cmd.ExecuteReader();

エラーが発生します:

指定された型はターゲット サーバーに登録されていません。

これを機能させるために必要なことを見つけることができませんでした。

4

1 に答える 1

7

を使用する必要がありますSqlDbType.Structured.Udtテーブル値パラメーターまたはテーブル型ではなく、CLR ユーザー定義型 IIRC です。TVP/テーブル値パラメーターは、ユーザー定義型ではなくエイリアス型です。繰り返しますが、これは TVP とは関係がなく、コードで何らかの形や形で言及してはならないため、これを伝える必要もありません。.UdtTypeNameUdt

手順が次のようになっている場合:

CREATE PROCEDURE dbo.MyProcedure
  @ListOfGUIDs dbo.ListOfGuids READONLY
AS
BEGIN
  ...
END

次に、C# コードは次のようになります。

SqlCommand cmd       = new SqlCommand("dbo.MyProcedure", conn);
cmd.CommandType      = CommandType.StoredProcedure;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@ListOfGUIDs", ListOfIDs);
tvparam.SqlDbType    = SqlDbType.Structured;

または、ステートメントがある場合は、次のようSELECT * FROM @ListOfGUIDsになります。

SqlCommand cmd       = new SqlCommand("SELECT * FROM @ListOfGUIDs", conn);
cmd.CommandType      = CommandType.Text;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@ListOfGUIDs", ListOfIDs);
tvparam.SqlDbType    = SqlDbType.Structured;
于 2013-10-14T19:50:13.327 に答える