【问题标题】:The data types varchar(max) and date are incompatible in the add operator数据类型 varchar(max) 和 date 在 add 运算符中不兼容
【发布时间】:2015-04-23 12:12:40
【问题描述】:

我在这里创建了一个搜索 SP,只是根据屏幕上的用户输入准备参数。

现在我需要将表格列以及输入参数转换为DATE类型,然后需要查询。

以下是我需要实现的部分程序。

问题是,我现在收到以下错误:

数据类型 varchar(max) 和 date 在 add 运算符中不兼容。

DECLARE @WhereClause VARCHAR(MAX)
DECLARE @DateField DATETIME = GETDATE()
DECLARE @DateFieldTo DATETIME =  GETDATE() +1

SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN ''' + CAST(@DateField AS DATE) + ''' + AND ''' +  CAST(@DateFieldTo AS DATE)+ ''        

PRINT @WhereClause

我尝试了以下方法:

DECLARE @WhereClause VARCHAR(MAX)
DECLARE @DateField DATETIME = GETDATE()
DECLARE @DateFieldTo DATETIME =  GETDATE() +1
DECLARE @YourSQLVariable VARCHAR(MAX)

SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN  CAST(@DateField AS DATE) + AND  CAST(@DateFieldTo AS DATE)'

SET @YourSQLVariable = 'SELECT 1 WHERE' + @WhereClause

EXEC sp_executeSQL @YourSQLVariable,N'@DateField   DATETIME,@DateFieldTo DATETIME ',@DateField,@DateFieldTo

得到:

错误:过程需要“ntext/nchar/nvarchar”类型的参数“@statement”。

【问题讨论】:

  • 您必须先将CAST(@DateField AS DATE) 的部分转换为varchar

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

这是因为您试图在此行中将 DATE 类型 CAST(tbl.DateField AS DATE) 与字符串 @WhereClause 连接起来,这是不受支持的:

  SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN ''' + CAST(@DateField AS DATE) + ''' + AND ''' +  CAST(@DateFieldTo AS DATE)+ ''   

您可以使用以下方法实现此目的:

  SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN  CAST(@DateField AS DATE) + AND  CAST(@DateFieldTo AS DATE)' 

当运行sp_executeSQL 时,使用这个:

@YourSQLVariable = @SelectClause + @WhereClause
EXEC sp_executeSQL @YourSQLVariable,N'@DateField DATETIME,@DateFieldTo DATETIME ',@DateField,@DateFieldTo

【讨论】:

  • 我在上面编辑过的问题中显示的示例脚本上尝试过,但又出现了另一个错误。请指导。
  • 这是因为错误状态 sp_executeSQL 需要 ntext/nchar/nvarchar 类型的参数。将变量 @YourSQLVariable 更改为 NVARCHAR(MAX)
【解决方案2】:

您可以尝试这个仅用于日期转换或日期比较 w.r.t 日期,

DECLARE @SqlQuery VARCHAR(MAX) = ''
DECLARE @UserId VARCHAR(MAX) = 'TestUser'
DECLARE @StartDate DATETIME = GETDATE()
DECLARE @EndDate DATETIME = DATEADD(WEEK, -6, GETDATE())
SET @SqlQuery = 'SELECT * FROM User Z WHERE Z.Id = ''' + @UserId + ''' AND CAST(Z.CreatedDate AS DATE) BETWEEN CAST(''' + CONVERT(NVARCHAR(24), @StartDate, 101) + ''' AS DATE) AND CAST(''' + CONVERT(NVARCHAR(24), @ENDDATE, 101)  +''' AS DATE)'

【讨论】:

    【解决方案3】:

    您不能将日期对象与字符串连接:

    DECLARE @WhereClause VARCHAR(MAX)
    DECLARE @DateField DATETIME = GETDATE()
    DECLARE @DateFieldTo DATETIME =  GETDATE() +1
    
    SET @WhereClause = @WhereClause + ' AND CONVERT(VARCHAR(10),tbl.DateField,120) BETWEEN ''' + CONVERT(VARCHAR(10),@DateField,120) + ''' + AND ''' +  CONVERT(VARCHAR(10),@DateFieldTo,120)+ ''''        
    
    PRINT @WhereClause
    

    【讨论】:

      【解决方案4】:

      SQL 不允许字符串与其他数据类型连接。

      DECLARE @WhereClause VARCHAR(MAX) = ''
      DECLARE @DateField DATETIME = GETDATE()
      DECLARE @DateFieldTo DATETIME =  GETDATE() +1
      
      SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN '''  + CONVERT(VARCHAR(25), @DateField, 120) + ''' AND ''' +  CONVERT(VARCHAR(25), @DateFieldTo, 120) + ''''
      
      PRINT @WhereClause
      

      此外,@WhereClause 未定义,因此连接不适用于初始空字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 2017-06-19
        • 1970-01-01
        相关资源
        最近更新 更多