2014-10-29 73 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

相关问题