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) ) )

我正在尝试编写一个 UDF,它将接受 XML 和属性名称作为输入并输出一个字符串。如何生成 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") 理解为 XML 值,而不是 XQuery。任何想法我需要做什么?

4

1 回答 1

1

You can't. XML methods are just like SQL queries, they are statically compiled into execution plans and hence cannot accept dynamic parts. Where SQL cannot accept the FROM table to be a variable, XML cannot accept XPath and XQuery expressions to be variables.

You could resort to construct dynamic SQL, but you cannot do that in a function.

于 2009-09-21T23:48:49.547 回答