2

私の場合、異なるデータベース バージョン (SQL Server) があります。たとえば、私のテーブルにはバージョン Aordersの列がありますhtmltextが、バージョン B には列htmltextがありません。

Select [order_id], [order_date], [htmltext] from orders

存在する場合、列にアクセスするために必要な巨大な(本当に巨大なステートメント)がありますhtmltext

私は、if exists2 つの領域で条件を実行できることを知っていbegin + endます。しかし、これは非常に厄介です。私の巨大なクエリは、SQL スクリプト全体 (大量のステートメントを含む) で 2 回使用されるからです。

列を選択する可能性はありますか - ただし、列が存在しない場合でも、エラーをスローする代わりに無視 (または「null」に設定) されます (isnull() 関数と同様)?

ありがとうございました!

4

3 に答える 3

5

両方のバージョンでビューを作成します。

列 htmltext が存在するバージョンでは、次のように作成します

Create view vw_Table1 
AS
select * from <your Table>

htmlText が存在しないバージョンでは、次のように作成します。

Create view vw_Table1 
AS
select *,NULL as htmlText from <your Table>

これで、アプリケーション コードで、テーブル自体の代わりにこのビューを安全に使用でき、要求どおりに動作します。

于 2013-06-28T07:18:50.673 に答える
2

最初に、なぜ列が欠落するのでしょうか? 間違いなくどこかで削除されています。その場合、削除プロセスで依存関係が更新/修正されている必要があります。

壊れた後に修正するのではなく、何かを壊す前にいくつかのプロトコルを採用して賢明な動きをする方が良いでしょう。

IF Existsクエリの実行を維持するのに役立つ回避策ですが、巨大なデータベースとクエリを考慮するとオーバーヘッドになります

于 2013-06-28T07:13:09.520 に答える
1

これにアプローチする「最良の」方法は、列がデータベースに存在するかどうかを確認し、その情報に基づいて動的に SQL クエリを作成することです。これを行うためのより適切な方法があるかどうかは疑問です。

列が存在するかどうかの確認:

SELECT * 
FROM   sys.columns 
WHERE  Name = N'columnName' 
AND    Object_ID = Object_ID(N'tableName');

詳細情報: SQL Server の動的 SQL ステートメント

于 2013-06-28T07:25:39.880 に答える