动态Sp_Executesql在日期时间转换错误上失败

时间:2019-06-12 20:26:16

标签: sql sql-server datetime dynamic-sql

我有一个非常简单的动态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)转换为日期时间时出错。”

1 个答案:

答案 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