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