2016-09-28 69 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你说得对,'空'对这种情况非常有效;做出答案,我会解决这个问题。谢谢! –

回答