问题描述
我正在使用EXEC sp_executesql在sql Server 2017中进行动态查询。
我尝试了各种测试方案,只要传入的值是 Integers ,就可以在查询中获得其他参数的结果。因此,这意味着位置和部门测试有效。但是,当我发送NVARCHAR或DateTime时,我无法确定是否需要做一些其他事情。
这是我的存储过程,带有NVARCHAR参数。您看到我做错了什么吗?
(
@tktitle NVARCHAR(200)
)
AS
BEGIN
Declare @sql NVARCHAR(MAX)
Set @sql = 'SELECT timekeep.tkinit,timekeep.tkfirst,timekeep.tklast,timekeep.tkemdate,timekeep.tktitle,timekeep.tkloc,timekeep.tkdept
FROM abc.xyz'
IF @tktitle IS NOT NULL
Select @sql = @sql + 'AND ([tktitle] = @tktitle)'
EXEC sp_executesql @sql,N'@tktitle varchar',@tktitle
END
解决方法
我至少可以确定三个问题:
- 将
varchar
作为参数传递时,需要指定其长度。 - 您还需要在
AND
之前加一个空格,并且AND
应该是WHERE
。 - 您需要在execute调用中分配参数。
所以:
IF @tktitle IS NOT NULL
Select @SQL = @SQL + ' WHERE ([tktitle] = @tktitle)';
-------------------------^ separator
EXEC sp_executesql @SQL,N'@tktitle varchar(200)',@tktitle=@tktitle;