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

Sql 从字符串转换日期和/或时间时获取转换失败,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在动态创建一个存储过程,其中有一个main子句和一个where子句: CREATE ROCEDURE [dbo].[spLocal_GetData] @CreatedOnDate DateTime AS declare @MainQuery varchar(max), @WhereClause varchar(1000) Select @MainQuery = 'Select column from

我正在动态创建一个存储过程,其中有一个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
我得到一个错误:

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

Edit1:

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

出现此错误的原因是,您试图将日期时间值与字符串
'串联,其中T1.CreateOn>='+@CreatedOnDate
,datetime是优先级更高的数据类型sql server尝试将字符串值转换为日期时间,但失败

您的方法很容易进行sql注入。为此,您应该使用动态sql。虽然对于这个简单的查询,您甚至不需要动态sql,但是假设实际的查询更复杂一些,并且您实际上需要动态sql,您可以这样做

试试这个,它还可以保护您免受sql注入攻击

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

在将其附加到动态sql之前,必须将
DateTime
转换为
varchar

所以


将为您工作。

您使用的是哪种数据库管理系统?(看起来不像ANSI SQL……)JARLH使用SQL Server 2008 R2这个解决方案将修正日期转换问题,但这就像在猪上涂口红一样。请不要建议糟糕的编程实践,谢谢。我同意M.阿里的观点,而且,您在发布之前是否尝试过建议的答案?现在获得“将数据类型nvarchar转换为datetime时出错”@Simsons用您现在写的内容更新您的问题,还要确认列
CreateOn
是一个日期/日期时间数据类型列?是的,CreateOn是日期时间在这种情况下它必须工作,用您现在尝试的内容更新您的问题,让我们看看哪里出了问题。下面是M.Ali的代码和一个基本表(称为表:P),它可以工作:
Select @WhereClause =' Where  T1.CreateOn >='+convert(varchar(20),@CreatedOnDate,120)