我的应用程序将数据序列化为各种 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。任何想法我需要做什么?