2016-09-28 42 views
2

我有這個存儲過程,它接收到@Value參數。如果參數值爲NULL,我需要使用該值來過濾一些數據,或者忽略過濾。如何在XQuery中將SQL:變量與NULL進行比較

使用DML只會簡單到

WHERE @Value IS NULL OR Value = @Value 

但我不知道如何使用XQuery表達式內同樣的想法。現在,我有一個類似的代碼:

DECLARE @Value AS VARCHAR(100) = 'f7fc6b6c-bb1b-4961-bb94-1053500436ac' 

SELECT   Form.FormType, 
       FormData   .value('(/*/Created)[1]' , 'date'  ) Created, 
       FormDataItem.this.value('@Source'   , 'varchar(100)') Source, 
       FormDataItem.this.value('@Value'   , 'varchar(100)') Value, 
       FormDataItem.this.value('@Text'    , 'varchar(100)') Text 
FROM   Form WITH (NOLOCK) 
CROSS APPLY  Form.FormData.nodes('//*[ 
       (
        (sql:variable("@Value") = "" and @Value != "") or 
        (sql:variable("@Value") != "" and @Value = sql:variable("@Value")) 
       )]') FormDataItem(this) 

我能避免這個問題:

  • 設置,@Value爲空字符串字面量,如果該值爲null,或
  • 使用一些動態的方法來製作XQuery表達式並執行它sp_executesql

但我想避免這種情況。

你能告訴我應該如何比較sql:variableNULL在XQuery中的值嗎?

+0

這可以通過[exists()](https://msdn.microsoft.com/en-us/library/ms189869.aspx?f=255&MSPPError=-2147217396)來實現嗎? – techspider

+1

這不是很直觀,因爲不涉及顯式序列,但['empty(sql:variable(「@Value」))'](https://msdn.microsoft.com/library/ms186394)應該可以工作。 –

+0

@JeroenMostert你說得對,'空'對這種情況非常有效;做出答案,我會解決這個問題。謝謝! –

回答

相關問題