【发布时间】:2021-11-24 04:37:03
【问题描述】:
在下面提到的这个查询中,我试图在 Execute 部分中使用 paramter@PARAM_D,但它会引发错误:
消息 402,第 16 级,状态 1,第 5 行 数据类型 varchar 和 date 在 add 运算符中不兼容。
这里可能出了什么问题?我可以使用其他 varchar 参数,但不能仅使用日期参数。
DECLARE @C VARCHAR(MAX)
DECLARE @PARAM_D DATE = '2021-07-31'
if 1=1
set @C = 'SELECT '+@PARAM_D +'as col1_X'
else
set @C = 'SELECT ''ABC'' as col1_x '
execute(@c)
print @PARAM_D
【问题讨论】:
-
您需要使用 cast or convert -- 并第二次使用 cast / convert 以使其成为日期列,而不是您正在创建的语句中的 varchar。只需使用
print @c并尝试运行您的语句,这样您就会看到 -
主要问题是您一起处理不同类型的数据,通过这样做,您强制 SQL Server 执行隐式 CONVERT,这会在这种情况下导致失败。但同样,问题不是查询中的特定位置,而是从头到尾,包括服务器通过隐式转换成功的位置!要更具体地了解该错误,则来源是这样做
'SELECT '+@PARAM_D +'as col1_X',这没有任何意义。你怎么能添加字符串到日期?!?日期是完全不同的类型。这就像在做:1km + 1hour这毫无意义! -
您可以使用具有特定格式样式的 CONVERT 来将日期表示为具有特定格式的字符串
-
你为什么要在这里使用“动态”语句而不需要它。
标签: date tsql parameters execute