繁体   English   中英

从字符串转换日期和/或时间时,获取转换失败

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM