EXEC sp_executesql将与整数一起使用,但不适用于VarChars

问题描述

我正在使用EXEC sp_executesqlsql 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;