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:variable
和NULL
在XQuery中的值吗?
这可以通过[exists()](https://msdn.microsoft.com/en-us/library/ms189869.aspx?f=255&MSPPError=-2147217396)来实现吗? – techspider
这不是很直观,因为不涉及显式序列,但['empty(sql:variable(“@Value”))'](https://msdn.microsoft.com/library/ms186394)应该可以工作。 –
@JeroenMostert你说得对,'空'对这种情况非常有效;做出答案,我会解决这个问题。谢谢! –