存储过程返回结果甚至认为它不应该
Stored procedure returning result even thought it's not supposed to
我有一个如下所示的存储过程:
ALTER PROCDURE [dbo].[zsp_selectallupceans_listProduction]
(@UPCList NVARCHAR(4000),
@EANList NVARCHAR(4000),
@Type TINYINT)
AS
SELECT
dd.UPC, dd.EAN, dd.EBAYID AS ItemID
FROM
ThirdPartyData AS dd
WHERE
EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@UPCList,',') S1
WHERE dd.UPC = S1.val)
OR EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@EANList,',') S2
WHERE dd.EAN = S2.val)
AND dd.Type = @Type
参数传递如下:
@UPCList='709127309019',
@EanList='0709127309019',
@Type=4
"SplitStringProduction" 函数如下所示:
ALTER FUNCTION [dbo].[SplitStringProduction]
(@string NVARCHAR(MAX),
@delimiter NVARCHAR(5))
RETURNS @t TABLE
(
val NVARCHAR(500)
)
AS
BEGIN
DECLARE @xml XML
SET @xml = N'<root><r>' + replace(@string,@delimiter,'</r><r>') + '</r></root>'
INSERT INTO @t(val)
SELECT
r.value('.','varchar(500)') AS item
FROM
@xml.nodes('//root/r') as records(r)
RETURN
END
现在,当我从我的 table 中执行一个简单的 select 时,如下所示:
select *
from thirdpartydata dd
where dd.UPC = '709127309019' -- note this is one of the parameters passed to the stored procedure...
我只会得到 1 个结果,其中列 Type
设置为“1”......
现在,当我尝试我的存储过程时:
exec zsp_selectallupceans_listProduction '709127309019','0709127309019',4
我仍然得到 1 个结果,即使我不应该得到任何结果,因为如果您看到 "Type" 参数设置为 4,则应该找不到匹配的记录... .
我这里做错了什么,我似乎无法弄清楚??
您需要将 OR
条件括在括号内:
WHERE (
EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@UPCList,',') S1 WHERE dd.UPC=S1.val)
OR EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@EANList,',') S2 WHERE dd.EAN=S2.val)
) AND dd.Type = @Type
没有他们你的查询是这样的:
WHERE EXISTS (...)
OR (EXISTS (...) AND dd.Type = @Type)
你得到的结果是因为第一个 OR 条件匹配。
我有一个如下所示的存储过程:
ALTER PROCDURE [dbo].[zsp_selectallupceans_listProduction]
(@UPCList NVARCHAR(4000),
@EANList NVARCHAR(4000),
@Type TINYINT)
AS
SELECT
dd.UPC, dd.EAN, dd.EBAYID AS ItemID
FROM
ThirdPartyData AS dd
WHERE
EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@UPCList,',') S1
WHERE dd.UPC = S1.val)
OR EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@EANList,',') S2
WHERE dd.EAN = S2.val)
AND dd.Type = @Type
参数传递如下:
@UPCList='709127309019',
@EanList='0709127309019',
@Type=4
"SplitStringProduction" 函数如下所示:
ALTER FUNCTION [dbo].[SplitStringProduction]
(@string NVARCHAR(MAX),
@delimiter NVARCHAR(5))
RETURNS @t TABLE
(
val NVARCHAR(500)
)
AS
BEGIN
DECLARE @xml XML
SET @xml = N'<root><r>' + replace(@string,@delimiter,'</r><r>') + '</r></root>'
INSERT INTO @t(val)
SELECT
r.value('.','varchar(500)') AS item
FROM
@xml.nodes('//root/r') as records(r)
RETURN
END
现在,当我从我的 table 中执行一个简单的 select 时,如下所示:
select *
from thirdpartydata dd
where dd.UPC = '709127309019' -- note this is one of the parameters passed to the stored procedure...
我只会得到 1 个结果,其中列 Type
设置为“1”......
现在,当我尝试我的存储过程时:
exec zsp_selectallupceans_listProduction '709127309019','0709127309019',4
我仍然得到 1 个结果,即使我不应该得到任何结果,因为如果您看到 "Type" 参数设置为 4,则应该找不到匹配的记录... .
我这里做错了什么,我似乎无法弄清楚??
您需要将 OR
条件括在括号内:
WHERE (
EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@UPCList,',') S1 WHERE dd.UPC=S1.val)
OR EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@EANList,',') S2 WHERE dd.EAN=S2.val)
) AND dd.Type = @Type
没有他们你的查询是这样的:
WHERE EXISTS (...)
OR (EXISTS (...) AND dd.Type = @Type)
你得到的结果是因为第一个 OR 条件匹配。