sql-server - 在 UPDATE 中使用内联 XML 变量的 SQL 总是获取 null

标签 sql-server xml sql-update sql-function

我试图让这段代码工作,但结果对于output1、output2始终为NULL

我在 UPDATE 后测试了变量 @xml,但 @xml 也是 NULL。这使得 SET 中的 xml 查询返回 NULL。

CREATE FUNCTION fnXml
    (
      @input1 DECIMAL(8, 2) ,
      @input2 INT   
    )
RETURNS XML
AS 
    BEGIN
        DECLARE @xml XML
        SET @xml = ( SELECT @input1 + 1 AS c ,
                            @input2 + 2 AS i
                   FOR
                     XML PATH('r')
                   )
        RETURN @xml
    END
GO 


CREATE TABLE TestXml
    (
      ID INT ,
      Input1 DECIMAL(8, 2) ,
      Input2 INT ,
      Output1 DECIMAL(8, 2) ,
      Output2 INT
    )

INSERT  TestXml
VALUES  ( 1, 1, 2, NULL, NULL )
INSERT  TestXml
VALUES  ( 2, 3, 4, NULL, NULL )

DECLARE @xml XML

UPDATE  TestXml
SET     @xml = dbo.fnXml(Input1, Input2) , -- @xml is always NULL ???
        Output1 = ( SELECT  r.value('.', 'decimal(9,2)') AS item
                    FROM    @xml.nodes('//c') AS records ( r )
                  ) ,
        Output2 = ( SELECT  r.value('.', 'decimal(9,2)') AS item
                    FROM    @xml.nodes('//i') AS records ( r )
                  )


SELECT  *
FROM    testxml
/*
Result
ID  Input1  Input2  Output1 Output2
1   1.00    2   NULL    NULL
2   3.00    4   NULL    NULL
*/

--test fnXml independently
SET @xml = dbo.fnXml(1,2)

SELECT  r.value('.', 'decimal(9,2)') AS item
                    FROM    @xml.nodes('//c') AS records ( r )
/*
Result: 
item
2.00
*/

有人有解决这个问题的经验吗?

请帮忙。

谢谢

更新:我又进行了一次测试。如果内联变量不是 XML,则可以正常工作,如下例所示:

CREATE FUNCTION fnTestNumber ( @input1 INT )
RETURNS INT
AS 
    BEGIN 
        RETURN @input1 + 1
    END
GO 

CREATE TABLE TestNumber
    (
      ID INT ,     
      Input1 INT ,
      Output1 INT,
      Output2 INT
    )

INSERT  TestNumber VALUES  ( 1, 1, NULL, NULL )
INSERT  TestNumber VALUES  ( 2, 2, NULL, NULL )

DECLARE @temp INT

UPDATE  TestNumber
SET     @temp = dbo.fnTestNumber(Input1),
        Output1 = @temp + 1,
        Output2 = @temp + 2


SELECT  * FROM    TestNumber
/* Result
ID  Input1  Output1 Output2
1   1   3   4
2   2   4   5
*/

结果符合预期,XML inline-variable 有什么问题吗?

最佳答案

使用WITH语句:

;WITH t AS 
(
    SELECT  dbo.fnXml(Input1, Input2) AS NewXML,Output1,Output2
    FROM TestXml
 )

UPDATE t
SET Output1=NewXML.value('(/r//c/node())[1]', 'DECIMAL(8,2)'),
Output2=NewXML.value('(/r//i/node())[1]', 'INT') 

SELECT  *
FROM    testxml

关于sql-server - 在 UPDATE 中使用内联 XML 变量的 SQL 总是获取 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39433134/

相关文章:

sql - 如何创建SQL Server函数以返回int?

Python Flask 应用程序无法解析 XML 请求数据

php - MySQL 查询有效,但 PHP 返回异常 : errorinfo:null

mysql - SQL 使用子查询更新列值

php - MySQL 使用 PHP 将 DATETIME 更新为 NOW()

sql - 上一次值由负变为正

sql - INSTEAD OF 触发器和 CASCADE 路径

xml - XSD 断言嵌套元素的属性相等?

python - 如何使用python转义xml属性中的特殊字符

sql - 按顺序使用 asc 和 desc 变量