0

私のアプリケーションは、データをさまざまなXML属性にシリアル化し、データに応じて、テキストまたはbase64として送信する場合があります。後者の場合、属性名は「attribute-base64」になります。したがって、SQLサーバー側では、次の規則を使用してXMLをデコードできます。

declare @DataXml xml
set @DataXml='<root v="test data"/>' ;
--or: set @DataXml='<root v-base64="AgB0AGUAcwB0ACAAHwQSBCQEFw...."/>' ;
SELECT ISNULL( 
    @DataXml.value('root[1]/@v', 'nvarchar(max)'), 
    CAST( @DataXml.value('xs:base64Binary(root[1]/@v-base64)', 
        'varbinary(max)') AS nvarchar(max) ) )

XMLと属性名を入力として受け入れ、文字列を出力するUDFを作成しようとしています。XQueryを生成するにはどうすればよいですか?これを試してみましたが、機能しません。

CREATE FUNCTION dbo. udf_DataXmlValue 
(
    @DataXml xml,
    @NodeName nvarchar(max),
    @AttributeName nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @result nvarchar(max) ;

    DECLARE @xquery nvarchar(max) ;
    SET @xquery = @NodeName + '[1]/' + @AttributeName;
    SET @result = @DataXml.value('sql:variable("@xquery")', 'nvarchar(max)') ;

    IF @result IS NULL
    BEGIN
        ... do base64 stuff ...
    END

    RETURN @result ;
END
GO

呼び出されたとき:

SELECT dbo.udf_DataXmlValue( @xml, 'root', 'v' )

戻り結果は値ではありませんが、'root [1] / @ v'...どうやら、SQLサーバーはsql:variable( "@ xquery")をXQueryではなくXML値として理解しているようです。私は何をする必要がありますか?

4

1 に答える 1

1

できません。XMLメソッドはSQLクエリと同じように、静的に実行プランにコンパイルされるため、動的な部分を受け入れることができません。SQLがFROMテーブルを変数として受け入れることができない場合、XMLはXPathおよびXQuery式を変数として受け入れることができません。

動的SQLの構築に頼ることはできますが、関数でそれを行うことはできません。

于 2009-09-21T23:48:49.547 に答える