Хранимая процедура возвращает результат, даже если она не должна - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть хранимая процедура, которая выглядит следующим образом:

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

Теперь, когда я делаю простой выбор из моей таблицы, как показано ниже:

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 результат, хотя я не должен получать никакого результата, потому что, если вы видите, что для параметра "Тип" установлено значение 4, то соответствующие записи не должны быть найдены ....

Что я здесь делаю не так, похоже, я не могу это понять ??

1 Ответ

0 голосов
/ 09 ноября 2018

Вы должны заключить условие 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)

И ваш результат получается потому, что первое ИЛИ условие совпадает.

...