请参阅关于 SO 的这个问题,因为它很相似。
我正在研究一种从数据库中具有日期值的所有表中删除一系列日期的方法(用于构建小型开发人员)。我构建了一个脚本,允许用户传入开始、结束和数据库值,但遇到了动态 sql 的问题。例如,当删除某些日期之间的记录时,我会遇到操作数冲突。下面显示了一个过度简化的示例:
DECLARE @b DATE, @e DATE, @cmd NVARCHAR(MAX)
SET @b = '2012-07-01'
SET @e = '2014-01-25'
SET @cmd = 'DELETE FROM DateTable
WHERE ValueDate BETWEEN ' + CONVERT(VARCHAR,@b,121) + ' AND ' + CONVERT(VARCHAR,@E,121)
EXEC sp_executesql @cmd
错误是Operand type clash: date is incompatible with int
。我尝试CAST
在动态 sql 中进行内部操作,因为错误表明ValueDate
变为和INT
:
-- Only the WHERE clause changed:
WHERE ValueDate BETWEEN CAST(' + CONVERT(VARCHAR,@b,121) + ' AS DATE) AND CAST(' + CONVERT(VARCHAR,@E,121) + ' AS DATE)'
这次的错误是Explicit conversion from data type int to date is not allowed
。最后我尝试使用其他格式(来自 MSDN)。简而言之,我想做 SO 用户想要完成的事情,但能够跨多个表完成(我什至搜索了一个脚本,因为我怀疑我是第一个想要这个的人)。
当它们产生错误时,您应该尝试打印您的命令。如果您发出这个而不是执行它:
你会看到:
产生这个:
其中,由于 SQL Server 看起来像带有几个减法运算符的三个整数,因此变成:
这甚至不是一个有效的
BETWEEN
操作,即使它可以将这些转换为日期。您应该做的是将这些作为适当的参数传递,例如
如果这些列中的任何一个是
DATETIME
,不是DATE
,那么您真的根本不应该使用BETWEEN
。反而:请阅读:
至于对数据库中的所有日期列重复此查询的总体要求,我将这样做(我查看了您引用的 SO 问题,它只显示了如何为一个表执行此操作):