我有以下代码:
declare @mydoc xml
declare @myPhone nvarchar(12) = '2223334445'
declare @lastName nvarchar(100) = 'John'
declare @myEmail nvarchar(100) = null
set @mydoc = '<details>
<phone />
<email />
<lastname>John</lastname>
</details>'
select @mydoc.exist('/details[fn:lower-case(lastname[1])=fn:lower-case(sql:variable("@lastName"))
and (phone[1]=sql:variable("@myPhone")
or phone[1]=fn:concat(fn:substring(sql:variable("@myPhone") ,1,3),"-",fn:substring(sql:variable("@myPhone") ,4,3), "-", fn:substring(sql:variable("@myPhone") ,7,4))
or (fn:lower-case(email[1])=fn:lower-case(sql:variable("@myEmail")) and not(fn:lower-case(sql:variable("@myEmail"))="null"))
)]')
基本上,如果它包含给定的姓氏以及电子邮件或电话(假设它们不为空或为null,则我想返回其细节节点)。我希望上面的代码返回0,因为即使姓氏= John,电话也是空的,不等于@myPhone,电子邮件为null。但是,它返回1。
如果我像下面那样更改代码(删除了电子邮件部分),它就可以正常工作,返回0。
declare @mydoc xml declare @myPhone nvarchar(12) = null --'2223334445' declare @lastName nvarchar(100) = 'John' declare @myEmail nvarchar(100) = null set @mydoc = '<lead> <phone /> <email /> <lastname>John</lastname> </lead>' select @mydoc.exist('/lead[fn:lower-case(lastname[1])=fn:lower-case(sql:variable("@lastName")) and (phone[1]=sql:variable("@myPhone") or phone[1]=fn:concat(fn:substring(sql:variable("@myPhone") ,1,3),"-",fn:substring(sql:variable("@myPhone") ,4,3), "-", fn:substring(sql:variable("@myPhone") ,7,4)))]')
我在电子邮件部分缺少什么?在第一个示例中,我检查了电子邮件是否不为空,因为起初我认为是问题所在,但是从第二个示例中可以看出,对于电话节点,查询在没有空检查的情况下仍然可以正常工作。
我有以下代码:声明@mydoc xml声明@myPhone nvarchar(12)='2223334445'声明@lastName nvarchar(100)='约翰'声明@myEmail nvarchar(100)=空集@mydoc ='
declare @mydoc xml;
declare @myPhone nvarchar(12) = '2223334445';
declare @lastName nvarchar(100) = 'JOHN';
declare @myEmail nvarchar(100)= '[email protected]';
set @mydoc = '<details>
<phone>123456</phone>
<email>[email protected]</email>
<lastname>John</lastname>
</details>';
select @mydoc.exist('
/details[lastname[lower-case(.)=lower-case(sql:variable("@lastName"))]][phone[lower-case(.)=lower-case(sql:variable("@myPhone"))] or email[lower-case(.)=lower-case(sql:variable("@myEmail"))]]');
go
declare @mydoc xml
declare @myPhone nvarchar(12) = '2223334445'
declare @lastName nvarchar(100) = 'John'
declare @myEmail nvarchar(100) = null
set @mydoc = '<details>
<phone />
<email />
<lastname>John</lastname>
</details>';
select @mydoc.exist('/details[lastname=sql:variable("@lastName")][phone=sql:variable("@myPhone") or email=sql:variable("@myEmail")]');
---------
set @mydoc = '<details>
<phone>2223334445</phone>
<email />
<lastname>John</lastname>
</details>'
select @mydoc.exist('/details[lastname=sql:variable("@lastName")][phone=sql:variable("@myPhone") or email=sql:variable("@myEmail")]');
---------
set @myEmail = '[email protected]'
set @mydoc = '<details>
<phone>123456</phone>
<email>[email protected]</email>
<lastname>John</lastname>
</details>';
select @mydoc.exist('/details[lastname=sql:variable("@lastName")][phone=sql:variable("@myPhone") or email=sql:variable("@myEmail")]');