Этот метод:
exec getStatusList @Extended='title1' AND @Extended = 'title2'
он вообще не будет работать, так как параметр или переменная вообще могут содержать только одно значение и ничего более.Таким образом, вы не сможете сделать это, если не выполните процедуру сохранения дважды и не зададите параметры для каждого из них.Или вы можете использовать петли, чтобы сделать это.Но я не фанат петель и всегда советую избегать их как можно больше.
Метод, который я считаю подходящим для вашей ситуации, - это TVP с некоторыми изменениями самой процедуры сохранения.
Итак, вы передадите значения через запятую в @Extended
, и из процедуры сохранения вы будете использовать IN()
и NOT IN()
вместо =
и <>
, это расширитэто иметь больше значений для сравнения, а не одно значение.
Затем вы можете использовать XML, чтобы разделить значения и превратить их в строки.
Итак, мы будем использовать это:
SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)')))
FROM (
SELECT CAST('<XMLRoot><RowData>' + REPLACE(@Extended,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) Extended
) D
CROSS APPLY Extended.nodes('/XMLRoot/RowData')m(n)
Вы можете добавить его непосредственно в процедуру сохранения с модификацией операторов, которые я упомянул выше, и она будет работать просто отлично.но для повторного использования кода мы будем использовать его как TVP.
CREATE FUNCTION SplitToRows
(
@Extended VARCHAR(MAX)
)
RETURNS TABLE
AS
RETURN
(
SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) Extended
FROM (
SELECT CAST('<XMLRoot><RowData>' + REPLACE(@Extended,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) Extended
) D
CROSS APPLY Extended.nodes('/XMLRoot/RowData')m(n)
)
Теперь вы можете изменить процедуру сохранения следующим образом:
[dbo].[getStatusList]
@Extended NVARCHAR(255) = 'Project Status'
, @Exclude NVARCHAR(255) = ''
, @All BIT = 0
AS
SET NOCOUNT ON
IF(@All = 0)
BEGIN
SELECT
[GeneralKey]
, [Label]
FROM [General]
WHERE
[Extended] IN( SELECT * FROM dbo.SplitToRows(@Extended) )
AND [Label] NOT IN( SELECT * FROM dbo.SplitToRows(@Exclude) )
ORDER BY
[OrderID];
END
ELSE
BEGIN
IF(@All = 1)
BEGIN
SELECT
0 AS [GeneralKey]
, 'Any' AS [Label]
, 0 AS [OrderID]
UNION ALL
SELECT
[GeneralKey]
, [Label]
, [OrderID]
FROM [General]
WHERE
[Extended] IN( SELECT * FROM dbo.SplitToRows(@Extended) )
AND [Label] NOT IN( SELECT * FROM dbo.SplitToRows(@Exclude) )
ORDER BY
[OrderID];
END
END
Теперь вы можете передавать несколько разделенных значений в @Extended и @Exclude одновременно, как это:
@Extended = 'title1, title2, title3'
@Exclude = 'title5, title8'
, поэтому оба параметра будут использовать один и тот же метод.