Sql server 搜索存储过程(SQL Server)--从字符串转换日期和/或时间时转换失败--简单?

Sql server 搜索存储过程(SQL Server)--从字符串转换日期和/或时间时转换失败--简单?,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个存储过程,我将3个变量bankNumber,branchNumber和DateFrom传递到 基于这些变量,我想查询表(见存储过程下面的图片),以返回满足我传递的条件(通过变量)的所有记录 相反,我得到了以下错误: 从字符串转换日期和/或时间时转换失败 当我将DateFrom变量传递给它时,它似乎失败了 谢谢你的帮助 ALTER PROCEDURE [dbo].[Search_Records] @bankNumber varchar(3), @branchNumber

我有一个存储过程,我将3个变量
bankNumber
branchNumber
DateFrom
传递到

基于这些变量,我想查询表(见存储过程下面的图片),以返回满足我传递的条件(通过变量)的所有记录

相反,我得到了以下错误:

从字符串转换日期和/或时间时转换失败

当我将
DateFrom
变量传递给它时,它似乎失败了

谢谢你的帮助

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

不能使用带有日期时间值的
LIKE
运算符。如果只在月份匹配,则需要使用
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来查询具有可选参数的这一个。< /P>您使用MySQL吗?还是SQL Server?它们不是同一件事。@johncode-sql-server感谢您指出这一点。您所说的

@DateFrom+'%'
是什么意思?配对月份?比赛日?配对年?匹配时间?………@M.Ali我只想匹配月份。谢谢你的提问。
@dateCreated
是从哪里来的?我很抱歉,我知道我之前误报了你,我的意思是我正在尝试匹配此格式MM/DD/YY
MM/DD/YY
是日期时间值的字符串表示形式。您的列和变量都是Datetime数据类型,这很好。您只需要在select中使用Convert函数来获得所需的日期格式,我认为应该是
Convert(VARCHAR(8),A.dateCreated,1)
我现在要实现它,看看它是如何实现的。我会开车。非常感谢。