我有一个非常简单的动态SQL查询,特别需要使用带有参数的sp_executesql进行调用。该查询在常规动态SQL中工作正常,但是在对转换错误使用sp_executesql时失败。
我尝试了许多动态SQL组合,但是似乎没有一个组合专门用于与sp_executesql相关的日期时间转换。
declare
@sql_nvarchar nvarchar(max),
@datetime datetime = GETDATE(),
@sqlparams nvarchar(max),
@tablename nvarchar(max) = 'SomeTableName'
Set @sql_nvarchar =
N'
Select *
from ' + @tablename + '
where Date > ''' + convert(nvarchar(23), @datetime, 101) + ''' '
Set @sqlparams =
N'
@datetime datetime,
@tablename nvarchar(max)
'
EXEC(@sql_nvarchar)
EXEC [sp_executesql] @sql_nvarchar,@sqlparams, @datetime, @tablename
第一个执行程序正确返回所需的查询,第二个执行程序抛出错误:“将数据类型nvarchar(max)转换为日期时间时出错。”
答案 0 :(得分:-1)
您不能参数化标识符,例如表名。因此,将其表达为:
Set @sql_nvarchar = N'
Select *
from ' + @tablename + '
where Date > @datetime
';
Set @sqlparams = N'@datetime datetime'
exec sp_executesql @sql_nvarchar, @sqlparams,
@datetime=@datetime