Simsons
Simsons

Reputation: 12745

Getting Conversion failed when converting date and/or time from character string

I am creating a stored procedure dynamically where I have a main clause and a where clause:

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

Now while executing the stored procedure:

DECLARE @CreatedOnDate datetime
SET @CreatedOnDate =GETDATE()

EXECUTE @RC = [dbo].[spLocal_GetData] ,@CreatedOnDate
GO

I get the error:

Conversion failed when converting date and/or time from character string.

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

Upvotes: 0

Views: 745

Answers (2)

M.Ali
M.Ali

Reputation: 69564

You are getting the error because you are trying to concatenate a datetime value with a string ' Where T1.CreateOn >='+@CreatedOnDate , Datetime being a higher precedence data type sql server tries to convert the string value to datetime and fails.

You method is prone to sql-injection you should use dynamic sql for this. Although for this simple query you do not even need dynamic sql but assuming the actual query is a bit more complex and you actually need dynamic sql for it you would do it something like this.....

Try this, it will also protect you against sql-injection attack......

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

Upvotes: 2

AfterGlow
AfterGlow

Reputation: 227

You have to convert DateTime to varchar before appending it to dynamic sql

so

Select @WhereClause =' Where  T1.CreateOn >='+convert(varchar(20),@CreatedOnDate,120) 

will work for you.

Upvotes: 0

Related Questions