說我有這個表:動態SQL中使用不符合sp_executesql的和參數
create table CodeTable (
CodeType int,
CodeVal char(2),
CodeDesc varchar(50))
insert CodeTable values
(1, 'AB', 'Desc for AB'),
(1, 'CD', 'Desc for CD'),
(1, 'DE', 'Desc for DE'),
(2, 'FG', 'Desc for FG'),
(2, 'HI', 'Desc for HI')
我希望有一個存儲過程從表中獲取的值,但是如果需要排除規定代碼:
CREATE PROCEDURE [dbo].[GetCodes]
@CodeType int,
@NotInList varchar(100) = ''
AS
BEGIN
SET NOCOUNT ON;
declare @sql nvarchar(1000) = '
select CodeType, CodeVal, CodeDesc
from CodeTable
where CodeType = @CodeType'
if isnull(@NotInList, '') <> ''
set @sql += ' and CodeVal not in (@NotInList)'
exec sp_executesql @sql, N'@CodeType int, @NotInList varchar(100)', @CodeType, @NotInList
END
的需要,這些工作:
exec [dbo].[GetCodes] 1, ''
exec [dbo].[GetCodes] 1, 'AB'
但是,這些給了我所有代碼:
exec [dbo].[GetCodes] 1, 'AB,CD'
exec [dbo].[GetCodes] 1, '''AB'',''CD'''
我錯過了什麼?我知道我可以用sp_executesql
來做到這一點,沒有參數,並建立完整的SQL字符串,但我想知道我是否可以用params做到這一點。謝謝!
以備將來使用,你可能要考慮使用「表值參數」,所以,你可以通過@NotInList作爲一個表,然後再加入或執行WHERE NOT EXISTS該表。這可以節省你不得不使用動態SQL。 –