【问题标题】:Stored Procedure Operand type clash: date is incompatible with int存储过程操作数类型冲突:日期与 int 不兼容
【发布时间】:2016-07-21 13:32:28
【问题描述】:

这是我的存储过程

ALTER PROCEDURE [dbo].[sp_ListFirmJobFilter]
    (@Status as nvarchar(10),
     @CityID as nvarchar(10),
     @DataStart as date,
     @DataEnd as date,
     @FirmID as nvarchar(10)
)
AS
BEGIN
    DECLARE @Sql NVARCHAR(MAX) 
    SET @Sql = N'SELECT * FROM Jobs WHERE 1=1'

    IF @Status IS NOT NULL
    BEGIN
        SET @Sql += ' AND Status = '+@Status+''
    END

    IF @CityID IS NOT NULL
    BEGIN
        SET @Sql += ' AND CityID = '+@CityID+''
    END

    IF @FirmID IS NOT NULL
    BEGIN
        SET @Sql += ' AND FirmID = '+@FirmID+' '
    END

    IF @DataStart IS NOT NULL
    BEGIN
        SET @Sql += ' AND (InsertedDate >= ' + CONVERT(VARCHAR(50), @DataStart)
        SET @Sql += ' AND InsertedDate <= ' + CONVERT(VARCHAR(50), @DataEnd)
        SET @Sql += ')'
    END 

    PRINT(@Sql)
    EXEC(@Sql)
END

命令成功完成。

但是当我使用那个参数执行那个存储过程时

DECLARE @return_value int

EXEC @return_value = [dbo].[sp_ListFirmJobFilter]
                        @Status = NULL,
                        @CityID = null,
                        @DataStart = N'2016-06-26',
                        @DataEnd = N'2016-06-28',
                        @FirmID = 4

SELECT  'Return Value' = @return_value
GO

我收到一个错误:

操作数类型冲突:日期与 int 不兼容

我寻找已执行的 SQL 命令(打印 SQL 字符串)。这是执行命令:

SELECT * 
FROM Jobs 
WHERE 1=1 
  AND FirmID = 4  
  AND (InsertedDate >= 2016-06-26 AND InsertedDate <= 2016-06-28)

当我执行它时,它给出了同样的错误。我把它改成:

SELECT * 
FROM Jobs 
WHERE 1=1 
  AND FirmID = 4  
  AND (InsertedDate >= '2016-06-26' AND InsertedDate <= '2016-06-28')

这行得通。

我该怎么办? InsertedDate 类型为日期

【问题讨论】:

标签: sql sql-server stored-procedures


【解决方案1】:

将日期用单引号括起来

SET @Sql += ' AND (InsertedDate >= ''' + CONVERT(VARCHAR(50), @DataStart) +''''
SET @Sql += ' AND InsertedDate <= ''' + CONVERT(VARCHAR(50), @DataEnd) +''''
SET @Sql += ')'

【讨论】:

    【解决方案2】:

    正如 Squirrel 所说,您自己也注意到了,日期必须用单引号括起来。

    我个人喜欢为此使用QUOTENAME

    SET @Sql += ' AND InsertedDate <= ' + QUOTENAME(CONVERT(VARCHAR(50), @DataEnd), '''')
    

    【讨论】:

      【解决方案3】:

      你需要用单引号将你的日期字符串括起来

      SET @Sql += ' AND (InsertedDate >= ==' + CONVERT(VARCHAR(50), @DataStart) + ''''
      

      【讨论】:

        猜你喜欢
        • 2019-10-31
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        相关资源
        最近更新 更多