16

次のように定義された SQL Server 2012 のテーブル値パラメーターがあります。

CREATE TYPE [dbo].[TVP] AS TABLE (
    [Id] [int] NOT NULL,
    [FieldName] [nvarchar](100) NOT NULL,
    [Value] [sql_variant] NOT NULL
)

おおよそ次のようなコードを使用して C# で呼び出します。

var mdItems = new DataTable();
mdItems.Columns.Add("Id", typeof(int));
mdItems.Columns.Add("FieldName", typeof(string));
mdItems.Columns.Add("Value", typeof(object));
mdItems.Rows.Add(new object[] {2, "blah", "value"}); //'value' is usually a string
SqlCommand sqlCommand = conn.CreateCommand();
sqlCommand.CommandText = "[WriteFieldValues]";
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@FieldValues", mdItems);
sqlCommand.ExecuteNonQuery();

ExecuteNonQuery次に、呼び出し時に SQL Server から次のエラーが表示されます。

列「値」のタイプはサポートされていません。タイプは「オブジェクト」

マイクロソフトの既知のバグとして特定された 3 年前に、同じ問題に遭遇したを見つけました。ただし、バグへのリンクは壊れています。バグのステータスまたは潜在的な回避策に関する最新情報があるかどうかを知っている人はいますか? 現状では、このバグは実際にsql_variantフィールドの価値を殺しています。

4

3 に答える 3

1

願わくば、この「万能型」のデータ モデルをうまく活用してください。通常、集合ベースのリレーショナル代数と sargeability の誤解が原因で、スケーリングしようとすると、顔が爆発します。たぶん、あなたはこれについて少し考えました。このモデルで ETL やレポートを作成したくありません。

オブジェクトをデータベース エンジンに挿入しようとしていることに注意してください。オブジェクトは、基になる構造を認識していません。オブジェクトは非常に一般的であるため、オブジェクトの受信者はそれを解釈する方法を知りません。オブジェクトにはプロパティがありますが、それらにアクセスできるのは、明示的な指示があるか、リフレクションを使用して基になる型を識別してパッケージを展開する場合のみです。オブジェクトについて何も知らなくても、オブジェクトを基になる型に確実に変換する (私が知っている) 唯一の方法は、リフレクションを使用することです。たぶん、.Net の専門家の何人かが、他の方法で私に情報を提供してくれるでしょう。

汎用オブジェクト型は、このように sql_variant として格納できません。sql_variant でさえ、いくらか厳密に型指定された値が必要です。SQL Server は、暗黙的にリフレクションを使用して、データ型 (および基になるデータの値) を把握しようとはしません。

System.Reflection の GetType メソッドを使用してから、case ステートメントをスローして、挿入する前にそれに応じてキャストすることができます。

于 2013-01-04T06:38:47.153 に答える
0

残念ながら、今はこれに完全に答える時間がありませんが、あなたを正しい道に導くことができます.

私が過去に行ったことは、TVP を使用するのではなく、XML パラメーターを使用し、データセット (または POCO) を XML としてシリアル化し、その XML を proc に渡し、「.nodes」プロパティを使用することです。 (および他のメンバー) xml 変数を使用して、必要なものを一時テーブル、ローカル テーブル変数、「作業テーブル」などに抽出します。

それは漠然としていますが、そのデータセットをシリアル化し、作成された xml を検査し、Books On Line の XML データ型を読むと、タスクを完了する方法を理解できる可能性があります。

それでも解決しない場合は、明日出発するときにこの質問に出くわしたので、実際の解決策をまとめてみます。

乾杯!!

于 2015-03-06T01:28:00.263 に答える