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

当面の問題は既に解決されていると思いますが、テーブル内の列が任意の日付/時刻型である場合、これらの変換はすべて絶対に不要であることを追加したかっただけです。同様に簡単に行うことができます:

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 に答える
0

基礎となる定義がなければ、@assigned_claim_table で指定されたテーブルに列 FTOStartDate と FTOEndDate が含まれていないように見えます。

とはいえ、テーブルがそうであったとしても、110 は米国形式の M/D/Y であり、比較が正しく機能しないため、クエリは間違った結果を生成します。ISO 112 が正しいでしょう。

于 2012-08-16T19:03:58.177 に答える