2014-10-29 48 views
1

我有一個存儲過程,我將3個變量bankNumber,branchNumberDateFrom傳遞給。搜索存儲過程(SQL Server) - 從字符串轉換日期和/或時間時轉換失敗 - 簡單嗎?

基於這些變量,我想查詢表(在下面的圖片中看到的存儲過程)返回符合我傳遞的標準(通過變量)的所有記錄。當我通過它DateFrom變量

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

這似乎是失敗的:

相反,我正在此錯誤。

謝謝您的幫助

ALTER PROCEDURE [dbo].[Search_Records] 
    @bankNumber varchar(3), 
    @branchNumber varchar(3), 
    @dateCreated datetime 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    DECLARE 
     @Bank_Number varchar(3) = @bankNumber, 
     @Branch_Number varchar(3) = @branchNumber, 
     @DateFrom datetime = @dateCreated, 
     @DateTo datetime = @dateCreated 

    SELECT DISTINCT  
     A.bankNumber, 
     A.branchNumber, 
     A.dateCreated 
    FROM   
     dbo.CENSORED A 
    WHERE 
     (@Branch_Number IS NULL OR bankNumber LIKE @BankNumber + '%') 
     AND (@Branch_Number IS NULL OR branchNumber LIKE @Branch_Number + '%') 
     AND (@DateFrom IS NULL OR dateCreated LIKE + @DateFrom + '%') 
     AND (@DateTo IS NULL OR dateCreated LIKE + @DateTo + '%') 
    END 

enter image description here

+0

你使用MySQL嗎?還是SQL Server?它們不是同一件事。 – 2014-10-29 19:26:03

+0

@JohnConde sql server感謝您指出。 – 2014-10-29 19:26:27

+0

'@DateFrom +'%''是什麼意思?匹配月份?匹配日?匹配年?匹配時間?.............. – 2014-10-29 19:31:26

回答

1

您不能使用LIKE運營商與datetime值。如果您僅在月份進行匹配,則需要使用MONTH()函數。 LIKE運算符只能與字符串數據類型一起使用。

沒有看到所有這些變量在存儲過程中聲明的點,一個簡化版本應該是這個樣子....

ALTER PROCEDURE [dbo].[Search_Records] 
    @bankNumber varchar(3), 
    @branchNumber varchar(3), 
    @dateCreated datetime 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT DISTINCT  
     A.bankNumber, 
     A.branchNumber, 
     A.dateCreated 
    FROM   
     dbo.CENSORED A 
    WHERE 
      (@Branch_Number IS NULL OR bankNumber LIKE @bankNumber + '%') 
     AND (@Branch_Number IS NULL OR branchNumber LIKE @branchNumber + '%') 
     AND (@dateCreated IS NULL OR (MONTH(dateCreated) = MONTH(@dateCreated) 
             AND 
             YEAR(dateCreated) = YEAR(@dateCreated))) 

END 

這將產生一個非常低效執行計劃,考慮使用動態sql查詢與這樣的可選參數。

+0

我的歉意我知道我早前誤解了你的意思我試圖匹配這種格式MM/DD/YY – 2014-10-29 19:49:48

+0

'MM/DD/YY'是日期時間值的字符串表示。你的列和變量都是Datetime數據類型,這是很好的。你只需要在你的select中使用Convert函數來獲得所需的日期格式,我認爲這應該是'CONVERT(VARCHAR(8),A.dateCreated,1)' – 2014-10-29 19:53:36

+0

我現在要實現這個,看看如何它走了。我會brb。謝謝! – 2014-10-29 19:56:05

相關問題