1

我有以下动态查询来检查今天的日期是否在数据表FTOStartDate之间。FTOEndDDate

我收到以下错误:

消息 207,级别 16,状态 1,第 18 行
无效的列名称“FTOStartDate”。
消息 207,级别 16,状态 1,第 19 行
无效的列名称“FTOEndDate”。

我查看的所有示例都在转换函数中使用了一个变量;我需要使用数据表中的列名。

谢谢,布拉德

SET @env = dbo.GetSQLEnvironment();
SET @assigned_claim_table = 'grp_clm_ops_d' + @env + '.dbo.cauDCMFToAssign';

SET @sql = 'SELECT DCMNumber,  FTOStartDate ' + 
           'FROM ' + @assigned_claim_table + ' ' +
           'WHERE '  + CONVERT(VARCHAR(10), GETDATE(), 110) + 
           ' NOT BETWEEN ' + CONVERT(VARCHAR(10), FTOStartDate, 110) + 
           'AND ' +  CONVERT(VARCHAR(10), FTOEndDate, 110) + ' '

EXEC sp_executesql @sql;
4

3 回答 3

1

为什么不这样做:

SET @sql = 'SELECT DCMNumber,  FTOStartDate ' + 
           'FROM ' + @assigned_claim_table + ' ' +
           'WHERE CONVERT(VARCHAR(10), GETDATE(), 110) NOT BETWEEN ' + 
           ' CONVERT(VARCHAR(10), FTOStartDate, 110) AND CONVERT(VARCHAR(10), FTOEndDate, 110)'

SQL Server 在动态查询中运行转换没有问题。

于 2012-08-16T19:04:02.617 回答
0

如果没有基础定义,@assigned_claim_table 中命名的表似乎不包含 FTOStartDate 和 FTOEndDate 列。

也就是说,即使表格有,查询也会产生错误的结果,因为 110 是美国格式的 M/D/Y,因此比较无法正常工作;ISO 112 是正确的。

于 2012-08-16T19:03:58.177 回答
0

我意识到您已经解决了眼前的问题,但我只想补充一点,如果表中的列是任何日期/时间类型,那么所有这些转换都是绝对不必要的。你可以很容易地做到:

SET @sql = 'SELECT DCMNumber,  FTOStartDate FROM ' 
  + @assigned_claim_table 
  + ' WHERE GETDATE() NOT BETWEEN FTOStartDate AND FTOEndDate;';

如果它们不是日期/时间,则:

SET @sql = 'SELECT DCMNumber,  FTOStartDate FROM ' 
  + @assigned_claim_table 
  + ' WHERE GETDATE() NOT BETWEEN CONVERT(DATETIME, FTOStartDate)
      AND CONVERT(DATETIME, FTOEndDate);';

如果您试图从列中剥离时间,这样做比将字符串转换为不明确的格式更安全:

SET @sql = 'SELECT DCMNumber,  FTOStartDate FROM ' 
  + @assigned_claim_table 
  + ' WHERE GETDATE() NOT BETWEEN DATEDIFF(DAY, 0, FTOStartDate)
      AND DATEDIFF(DAY, 0, FTOEndDate);';

不是那样,BETWEEN也不NOT BETWEEN是一个好主意——就像你的 110 格式一样,这是模棱两可的,容易被误解。

于 2012-08-16T19:20:32.713 回答