2014-07-02 65 views
1

我對XML XQuery很陌生,但這確實看起來應該起作用。SQL XML XQUERY - 看起來是正確的,返回NULL /空值

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

您需要聲明參數@ContactID作爲輸出參數。

試試這個:

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

的Mikael您好,感謝!這解決了這個問題。我只是知道它必須是簡單的東西。昨晚,在試圖在與這個問題搏鬥後的午夜睡覺的時候,我認爲它必須是這樣的。我非常欣賞第二套眼睛!事實上,我錯過了一些非常簡單的事情。 :) –