SQL Присоединиться к функции, которая возвращает таблицу из параметра, разделенного запятыми. Если параметр имеет значение null Присоединиться ко всем - PullRequest
1 голос
/ 24 апреля 2020

Учитывая следующую хранимую процедуру в T SQL, которая может быть передана в строке идентификаторов с разделителями-запятыми, которая дается функции, которая возвращает таблицу идентификаторов для присоединения, существует ли элегантный способ сделать это так, если переданный параметр @BomAssemIDs имеет значение NULL, поэтому вместо выбранных записей выбирается ALL.

В качестве объединения выполняется фильтрация, но если @BomAssemIDs равно нулю, я не хочу его использовать. , Я пытался избежать дополнительного кода или динамического кода c SQL, поэтому сейчас мое решение было бы большим оператором if, одно из которых использовало бы соединение с табличной функцией, а другое не использовало бы его. Кажется, я должен быть в состоянии express это элегантно, но я не могу gr asp это. Использование SQLServer 2012

ALTER PROCEDURE dbo.[up_BomAssem_by_BomAssemIDs]
    @JobID  int ,
    @BomAssemIDs varchar(2000) 
AS
BEGIN     
    SELECT ba.* 
    FROM BomAssem ba 
    JOIN dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl ON ba.BomAssemID = sl.RecID
    where ba.JobID = @JobID    
END

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Учитывая, что вы используете только join для фильтрации, я бы переместил его в предложение where (где применяется фильтрация), а затем добавил OR для проверки where @BomAssemIDs is null и, если это так, разрешил все записи через например,

SELECT ba.* 
FROM BomAssem ba
WHERE ba.JobID = @JobID
AND (
  @BomAssemIDs IS NULL
  OR ba.BomAssemID IN (select RecId from dbo.uf_SplitIntIDsToTable(@BomAssemIDs))
);

Я был бы упущен, если бы не указал, что вам будет гораздо лучше передать список, используя Табличный параметр вместо строки, разделенной запятой .

0 голосов
/ 24 апреля 2020

Вы можете использовать or с left join:

SELECT ba.* 
FROM BomAssem ba LEFT JOIN
     dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl
     ON ba.BomAssemID = sl.RecID OR @BomAssemIDs IS NULL
WHERE ba.JobID = @JobID;

Или просто использовать union all:

SELECT ba.* 
FROM BomAssem ba JOIN
     dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl
     ON ba.BomAssemID = sl.RecID 
WHERE ba.JobID = @JobID
UNION ALL
SELECT ba.* 
FROM BomAssem ba
WHERE @BomAssemIDs IS NULL
...