EXEC sp_executesql 将使用整数而不是 VarChars
EXEC sp_executesql will work with Integers but not VarChars
我在 SQL Server 2017 中使用 EXEC sp_executesql 进行动态查询。
我已经尝试了各种测试场景,只要传入的值是 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
之前添加一个 space,并且 AND
应该是 WHERE
。
- 您需要在执行调用中分配参数。
所以:
IF @tktitle IS NOT NULL
Select @SQL = @SQL + ' WHERE ([tktitle] = @tktitle)';
-------------------------^ separator
EXEC sp_executesql @SQL, N'@tktitle varchar(200)', @tktitle=@tktitle;
我在 SQL Server 2017 中使用 EXEC sp_executesql 进行动态查询。
我已经尝试了各种测试场景,只要传入的值是 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
之前添加一个 space,并且AND
应该是WHERE
。 - 您需要在执行调用中分配参数。
所以:
IF @tktitle IS NOT NULL
Select @SQL = @SQL + ' WHERE ([tktitle] = @tktitle)';
-------------------------^ separator
EXEC sp_executesql @SQL, N'@tktitle varchar(200)', @tktitle=@tktitle;