簡體   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