【问题标题】:I cannot use a datetime parameter inside the execute statement我不能在执行语句中使用日期时间参数
【发布时间】: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


【解决方案1】:

来自+ (Addition):“不能与datetimedatetime2datetimeoffset 数据类型一起使用。”

如果您将date 值更改为字符串,您可以将其与其他字符串连接:

set @C = 'select ''' + Cast( @Param_D as VarChar(30) ) + ''' as Col1_X;';

要使返回的实际值成为 date 数据类型,您需要返回 cast

set @C = 'select Cast( ''' + Cast( @Param_D as VarChar(30) ) + ''' as Date ) as Col1_X;';

除此之外:虽然这不是问题,但您可能需要阅读SQL Injection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多