0

次のtsqlは失敗します:

IF OBJECT_ID('FDSCorp.XLFILES') IS NOT NULL
BEGIN 
    DELETE FROM FDSCorp.XLFILES;

    INSERT INTO FDSCorp.XLFILES 
       SELECT DISTINCT * FROM dbo.XLFILES;
END
ELSE 
    exec sp_changeobjectowner XLFILES, FDSCorp;

エラー:

画像データタイプは比較できないため、DISTINCTとして選択できません。

はいXLFilESにはimage列がありますが、この場合FDSCorp.XLFILESは存在しないため、個別のコードが実行されることはありません。

このコードはデータベース内のテーブルごとに生成されます。コードのこのセクションは、明確な問題が原因で失敗する可能性のあるテーブルでは実行されないことを私は知っています。

そのシナリオが実際の状況で決して起こらない場合、私が明確に使用できないタイプのコードチェックを過度に複雑にする必要は本当にありません。

このチェックをバイパスする方法はありますか?

4

1 に答える 1

3

エラーを回避する唯一の方法は、サーバーがコンパイルしたくないコードを「認識」しないようにすることです。各バッチは、実行が開始される前に完全にコンパイルされます(すべてのステートメントを含み、制御フローを無視します)。

IF OBJECT_ID('FDSCorp.XLFILES') IS NOT NULL
BEGIN 
    DELETE FROM FDSCorp.XLFILES;

    exec sp_executesql N'INSERT INTO FDSCorp.XLFILES 
       SELECT DISTINCT * FROM dbo.XLFILES;';
END
ELSE 
    exec sp_changeobjectowner XLFILES, FDSCorp;

これで、このバッチがコンパイルされるとき、INSERTこのバッチに関する限り、それは単なる文字列リテラルであるため、コンパイルは試行されません。

于 2012-11-16T09:42:57.580 に答える