17

SQL Server 2008 BOLのこのページでは、CLR ストアド プロシージャについて説明し、「テーブル値パラメーター」というラベルの付いたセクションがあり、それらがどのように有利であるかについて説明しています。それは素晴らしいことです - CLR proc で TVP を使用したいのですが、残念ながら、これは宇宙でそのような可能性への唯一の参照のようであり、このセクションでは構文がどうなるかについて説明していません (また、詳細な情報もありません)。段落の最後にリンクされています)

確かに、T-SQL プロシージャから TVP を使用する方法や、一般的な CLR プロシージャを実行する方法の説明を簡単に見つけることができます。しかし、TVP を使用する CLR プロシージャを作成するのですか? 何もない。複数行のデータをストアド プロシージャに渡すことは一般的な問題であるため、これはすべて非常に珍しいことです。

これは、そのページのセクションの存在がエラーであるかどうか疑問に思います. 誰かがそうではないことを教えてください。詳細情報/例を教えてください。

[編集]

これに出くわしたとき、私もこれをMSフォーラムの1つに投稿しようとしていました.これは棺桶の最後の釘のようです. それはできないようです。

4

5 に答える 5

5

もっとたくさんの 参考文献を見つけることができます。ただし、これらはすべてテーブル値パラメーターを TSQL プロシージャに渡すためのものであるため、ほとんど役に立ちません。

しかし、それは不可能だという結論に達しました。まず、CLR 型と SQL 型の間のマッピングの一覧があります。テーブル タイプの場合、マッピングがないため、次の例は機能しません。

[SqlProcedure]
public static void StoredProcedure(DataTable tvp, out int sum)
{
    return 42;
}

その後

CREATE TYPE MyTableType AS TABLE 
(
    Id INT NOT NULL PRIMARY KEY,
    [Count] INT NOT NULL
)
GO
CREATE ASSEMBLY ClrTest FROM '<somePath>'
GO
CREATE PROCEDURE ClrTest
AS EXTERNAL NAME ClrTest.StoredProcedures.StoredProcedure
GO

どのような型 ( DataTableDbDataReaderIEnumerable) を試しても、CREATE PROCEDURE呼び出しはエラー 6552 を生成し続けます。パラメーター "@tvp" の T-SQL と CLR の型が一致しないため、"ClrTest" の CREATE PROCEDURE が失敗しました。

次に、リンク先のページのドキュメントには次のように記載されています。ユーザー定義のテーブル型は、SQL Server プロセスで実行されているマネージ ストアド プロシージャまたは関数に、テーブル値パラメーターとして渡すことも、それらから返すこともできません。

C# でユーザー定義のテーブル型を作成する方法がどこにも見つからないようですが、これも行き止まりのようです。

Microsoft フォーラムのどこかで質問できるかもしれません。CLR sproc ページでテーブル値パラメーターについて言及しているにもかかわらず、これを実装する方法を説明していないのは、依然として奇妙です。何か解決策があれば、教えていただきたいです。

于 2009-08-31T11:24:32.657 に答える
4

プロシージャを呼び出す前に作成および設定された一時テーブルを使用して、clr プロシージャ内でテーブルを読み取ることができます。

于 2012-07-04T14:25:47.707 に答える
2

解決策は、表形式のデータを Json 形式の文字列にシリアル化し、その文字列を CLR proc に渡すことです。clr プロシージャまたは関数内で、json を IEnumerable、リスト、または表形式のオブジェクトに解析します。その後、他のタイプの表形式データと同じようにデータを操作できます。

SQL テーブルを Json 形式の文字列にシリアル化できるユーティリティをいくつか作成しました。メールアドレスを教えていただける方と共有できれば幸いです。Phil Factor は、parseJson と呼ばれる優れた T-SQL Json パーサーを作成しました。私は彼のソリューションをclrに適応させ、はるかに高速に実行しました。どちらも Json 形式の文字列を受け入れ、文字列からテーブルを生成します。また、SQL 列に格納された Json 形式の文字列をシリアル化、解析、挿入、削除、および更新できる、T-SQL と CLR の両方で使用するさまざまな Json ユーティリティもあります。

于 2011-10-23T21:02:44.667 に答える
2

(カスタム イテレータがない VB とは対照的に) C# を使用する場合は、ADO.NET コードを記述して ExecuteNonQuery() を呼び出し、SqlDbType.Structuredパラメータ (つまり、TVP) を使用してストアド プロシージャを実行できます。

TVP の値として渡されるコレクションは、実装する必要がありますIEnumerable<SqlDataRecord>。この IEnumerable のyield returnが実行されるたびに、SqlDataRecordの「行」が「テーブル」パラメーターにパイプライン処理されます。

詳細については、この記事を参照してください。

于 2012-07-13T18:11:43.157 に答える
1

テーブルをCLRプロシージャに直接渡すことは現在不可能であるように見えますが、次の方法で最適ではありませんが、結果が得られました。

  • UDT FooTable の値を持つ TSQL テーブルを定義する
  • FooTable をパラメーターとして取り、FOR XML EXPLICIT を使用して XML を返す TSQL 関数を定義する
  • テーブル自体ではなく、結果の XML を CLR 関数/プロシージャに渡す

理想的ではありませんが、少し近づきます。

于 2011-09-22T11:01:11.847 に答える