[英]Getting Conversion failed when converting date and/or time from character string
我正在动态创建存储过程,其中有main子句和where子句:
CREATE ROCEDURE [dbo].[spLocal_GetData]
@CreatedOnDate DateTime
AS
declare @MainQuery varchar(max),
@WhereClause varchar(1000)
Select @MainQuery = 'Select column from Table T1'
Select @WhereClause = ' Where T1.CreateOn >='+@CreatedOnDate
现在,在执行存储过程时:
DECLARE @CreatedOnDate datetime
SET @CreatedOnDate =GETDATE()
EXECUTE @RC = [dbo].[spLocal_GetData] ,@CreatedOnDate
GO
我得到错误:
从字符串转换日期和/或时间时转换失败。
编辑1:
declare @MainQuery varchar(max),
@WhereClause varchar(1000)
Select @MainQuery =N'Select ..'
Select @WhereClause = N' Where T1.CreatedOn>=@CreatedOnDate'
EXECUTE @RC = [dbo].[spLocal_GetNonConformance]
,N'@CreatedOnDate DateTime'
GO
之所以出现错误,是因为您试图将日期时间值与字符串' Where T1.CreateOn >='+@CreatedOnDate
,日期时间是优先级较高的数据类型,sql server尝试将字符串值转换为日期时间,但失败。
您的方法易于进行sql注入,因此应使用动态sql。 虽然对于这个简单的查询,您甚至不需要动态SQL,但是假设实际查询稍微复杂一点,并且您实际上需要动态sql,则可以这样做。
试试这个,它也可以保护您免受sql-injection攻击……
CREATE ROCEDURE [dbo].[spLocal_GetData]
@CreatedOnDate DateTime
As
BEGIN
declare @MainQuery nvarchar(max)
SET @MainQuery = N'Select column from Table T1'
+ N' Where T1.CreateOn >= @CreatedOnDate'
Exec sp_executesql @MainQuery
,N'@CreatedOnDate DateTime'
,@CreatedOnDate
END
您必须先将DateTime
转换为varchar
然后再将其附加到动态sql
所以
Select @WhereClause =' Where T1.CreateOn >='+convert(varchar(20),@CreatedOnDate,120)
将为您工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.