SQL XML XQUERY - 看起来正确,返回NULL /空值

时间:2014-07-02 04:46:55

标签: sql sql-server xml

我对XML XQuery很新,但这肯定看起来应该有用。

XML片段

<Contacts>
  <Contact ContactID="7" FileType="MS">
    <ID>7</ID>
    ....
    <Comments ContactID="7" />
    <CompanyID ContactID="88">Some New Value</CompanyID>
    <CompanyName ContactID="7">Some New Value</CompanyName>
  </Contact>
</Contacts>

我将@SourceField传递给存储过程。在这种情况下,其值为CompanyID。然后我创建一个我称之为@xmlPath的变量。

SET @XmlPath = '/Contacts/Contact/' + @SourceField

我从表中检索XML到名为@ContactData的变量(参见上面的片段)

然后我创建一个变量@SqlCmd并执行它。

SET @SqlCmd = 'SET @ContactID = @ContactData.value(''(' + @xmlPath + '/@ContactID)[1]'', ''nvarchar(max)'')'

EXECUTE sp_executesql @SqlCmd, N'@ContactID nvarchar(20), @ContactData XML',@ContactID, @ContactData

我发出三个SQL命令来测试值。

SELECT @ContactData AS ContactData
SELECT @SqlCmd AS SqlCmd
SELECT @ContactID AS ContactID

第一个从表中返回XML。 (见上面的片段)

第二个返回以下内容;

SET @ContactID = @ContactData.value('(/Contacts/Contact/CompanyID/@ContactID)[1]', 'nvarchar(max)')

看起来不错但是......

,第三个返回NULL,我希望88。此外,当我初始化@ContactID = ''时,我收到空字符串。

所以,我的结论是我在某个地方错过了一个任务流程,但代码看起来就像我在网上看到的每个例子都有效。我必须遗漏一些简单的东西。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要将参数@ContactID声明为输出参数。

试试这个:

EXECUTE sp_executesql @SqlCmd, N'@ContactID nvarchar(20) out, @ContactData XML',@ContactID out, @ContactData