2011-09-30 7 views
10

私はxml.nodes()たala、テーブル値メソッドから大きな恩恵を受けることCLR UDTを持っている:SQL CLRのユーザー定義型にテーブル値の*メソッド*を作成することはできますか?

-- nodes() example, for reference: 
declare @xml xml = '<id>1</id><id>2</id><id>5</id><id>10</id>' 
select c.value('.','int') as id from @xml.nodes('/id') t (c) 

私は私のUDTのために似た何かをしたい:

-- would return tuples (1, 4), (1, 5), (1, 6)....(1, 20) 
declare @udt dbo.FancyType = '1.4:20' 
select * from @udt.AsTable() t (c) 

誰がどんな経験wを持っています/ この?どんな助けでも大歓迎です。私はいくつかのことを試したが、彼らはすべて失敗した。私はドキュメンテーションとサンプルを探して、見つけました。

はい、UDTをパラメータとして使用するテーブル値のUDFを作成できましたが、OOスタイルの単一の型にすべてをバンドルすることを望んでいました。

EDIT

ラッセルハートはthe documentation states that table-valued methods are not supportedを発見した、と(下記参照)、予想されるランタイムエラーを生成するために、私の構文を修正しました。

[SqlMethod(FillRowMethodName = "GetTable_FillRow", TableDefinition = "Id INT")] 
public IEnumerable GetTable() 
{ 
    ArrayList resultCollection = new ArrayList(); 
    resultCollection.Add(1); 
    resultCollection.Add(2); 
    resultCollection.Add(3); 
    return resultCollection; 
} 

public static void GetTable_FillRow(object tableResultObj, out SqlInt32 Id) 
{ 
    Id = (int)tableResultObj; 
} 

このビルドに成功展開:

はVS2010では、新しいUDTを作成した後、私は構造体定義の最後にこれを追加しました。しかし、その後、SSMSで、我々は(逐語をそうでない場合は)期待通りにランタイムエラーを取得:だから

-- needed to alias the column in the SELECT clause, rather than after the table alias. 
declare @this dbo.tvm_example = '' 
select t.[Id] as [ID] from @this.GetTable() as [t] 

Msg 2715, Level 16, State 3, Line 2 
Column, parameter, or variable #1: Cannot find data type dbo.tvm_example. 
Parameter or variable '@this' has an invalid data type. 

、後にすべての可能性ではないようです。可能であったとしても、SQL ServerのCLRオブジェクトの変更に制限があるため、おそらく賢明ではありません。

つまり、誰かがこの特定の制限を回避するためのハックを知っているならば、それに応じて新しい賞金を引き上げるつもりです。

答えて

6

テーブルのエイリアスがありますが、カラムのエイリアスはありません。ドキュメント、http://msdn.microsoft.com/en-us/library/ms131069(v=SQL.100).aspx#Y4739によると、

declare @this dbo.tvm_example = '' 
select t.[Id] as [ID] from @this.GetTable() as [t] 

試してみてください、これは間違った種類に関する別の実行時エラーで失敗する必要があります。

SqlMethodAttributeがSqlFunctionAttributeからFillRowMethodNameとのTableDefinitionフィールドを継承するようSqlMethodAttributeクラスは、SqlFunctionAttributeクラスから継承。これは、テーブル値のメソッドを書くことが可能であることを意味しますが、そうではありません。メソッドがコンパイルされ、アセンブリがデプロイされますが、実行時にIEnumerableの戻り値型に関するエラーが発生しました。 "メソッド、プロパティ、またはフィールド '' 'アセンブリ'の '' 'の戻り値の型が無効です。

これらの方法をサポートしていない可能性があります。メソッド更新を使用してアセンブリを変更すると、UDT列のデータに問題が発生する可能性があります。 適切な解決策は、UDTを最小限に抑え、それに付随する別々のクラスの方法です。これにより、柔軟性と完全に機能するメソッドが保証されます。

xml nodesメソッドは変更されないため、同じインプリメンテーションの制限を受けません。

これはピーターと幸運に役立ちます。

+0

ありがとうラス、はいそれは助けになります。 –

関連する問題