SQL Server - 在动态SQL语句中转换为smalldatetime

时间:2017-06-07 16:10:19

标签: sql-server

以下动态SQL会引发错误:

  

将字符串转换为smalldatetime数据类型

时转换失败

我的代码:

DECLARE @pTimeStamp smalldatetime
SET @pTimeStamp = '2017-05-22 12:15:00'

DECLARE @SQLQuery AS NVARCHAR(4000)
Set @SQLQuery = N'Select *' + 
' From SampleTable'  +
' Where TimeStamp = ' + @pTimeStamp

EXECUTE sp_executesql @SQLQuery

我也试过

Convert(smalldatetime, @pTimeStamp, 20) 

以及

CAST(@pTimeStamp AS smalldatetime) 

但我只有其他错误。我还尝试将@pTimeStamp声明为varchar(50),然后转换但仍然出错。

做一些简单的事情:

DECLARE @pTimeStamp smalldatetime
SET @pTimeStamp = '2012-01-22 12:15:00'

Select *
From SampleTable
Where TimeStamp = @pTimeStamp

运行正常,所以我猜它与动态SQL有关。

请帮忙......

2 个答案:

答案 0 :(得分:2)

SQL Server中日期/时间文字的唯一真正安全格式,至少对于datetimesmalldatetime,是:YYYYMMDDYYYY-MM-DDThh:mm:ss[.nnn] - {{3} }

您已使用sp_executesql,为什么不利用其参数?

declare @pTimeStamp smalldatetime;
declare @params nvarchar(4000);
declare @sqlquery nvarchar(4000);

set @pTimeStamp = '2017-05-22T12:15:00';
set @params = N'@pTimeStamp smalldatetime';
set @sqlquery = N'
select *
from SampleTable
where TimeStamp = @pTimeStamp';

execute sp_executesql @sqlquery, @params, @pTimeStamp;

rextester演示:Bad habits to kick : mis-handling date / range queries - Aaron Bertrand

动态sql参考:

答案 1 :(得分:0)

您需要将时间戳嵌入单引号中。尝试:

Set @SQLQuery = N'Select *' + 
' From SampleTable'  +
' Where TimeStamp = ''' + @pTimeStamp + ''''