2016-09-01 9 views
2

が存在する場合、私は、次の論理的な句を実行する必要があります:列が存在し、それが一定の値を、次に何かを持っている場合T SQLそれは、値Xを持っている場合、列は((当時

を ない場合は、何かをします。他

IF EXISTS(
    SELECT * 
    FROM sys.columns 
    WHERE Name  = N'legacyoptions' 
     AND Object_ID = Object_ID(N'config ')) 
BEGIN 
    if (select legacyoptions from config)=1 
     begin 
      Do stuff when legacy=1 
     end 
     else begin 
      Do stuff when legacy !=1 
     END 
else 
begin 
    do stuff when legacy is not present 
end 

しかし、このようなケースlegacyoptionsでは動作しません

+1

動的SQLを使用する方法があります。 – jarlh

+0

あなたのSQLはうまくいくようです。 「うまくいけない」とはどういう意味ですか? –

+1

@ZoharPeled - 'config'テーブルに' legacyoptions'という列がない場合、このバッチ全体が*コンパイル*に失敗します。したがって、テストが実行されて列が存在するかどうかを確認し、その列を照会するSELECT文を実行することは決してありません。 –

答えて

0

TRYキャッチブロックなどのコードブロックは、データベースのテーブルconfig及び/又はlegacyoptionsフィールドなしでコンパイルされる動的SQLを使用して、方法です。

BEGIN TRY 
    DECLARE @legacyoptions int; 
    EXECUTE sp_executesql N'select TOP 1 @legacyoptions=legacyoptions from config', 
          N'@legacyoptions int OUTPUT', 
          @legacyoptions OUTPUT; 
    if @legacyoptions=1 
     begin 
      -- Do stuff when legacy=1 
     end 
     ELSE 
     BEGIN 
      -- Do stuff when legacy !=1 
     END 
END TRY 
BEGIN CATCH 
    -- do stuff when legacy is not present 
END CATCH 
+0

これは魅力のように機能します。ありがとう。 – pinegulf

1

はこれを試して存在しません:。(私はあなたがいる場合の最後を残していると思います)

IF EXISTS(
    SELECT * 
    FROM sys.columns 
    WHERE Name  = N'legacyoptions' 
     AND Object_ID = Object_ID(N'config ')) 
BEGIN 
    if (select legacyoptions from config)=1 
     begin 
      Do stuff when legacy=1 
     end 
     else begin 
      Do stuff when legacy !=1 
     END 
end 
else 
begin 
    do stuff when legacy is not present 
end 
+0

申し訳ありませんが、これは "無効な列名 'legacyoptions'を返します。" legacyOptions列がないDBで実行している場合。私は2番目の場合はそれがうまく動作しますコメントして、これは問題自体です。 – pinegulf

0

これはうまくいくが、私にとっては馬鹿だ。ここ

IF EXISTS(SELECT * FROM sys.columns WHERE Name = N'legacyoptions' AND Object_ID = Object_ID(N'config ')) BEGIN exec(' if (select legacyoptions from config)=1 begin print ''Config==1'' end else begin print ''Config!=1'' end ') end else begin print 'no legacy' end

+0

なぜあなたには馬鹿に見えますか?あなたは他のプログラミング言語に精通していますか?元のコードは、別の言語では、最初にリフレクション/イントロスペクションを使用して特定の型が特定のメソッドを含むかどうかを判定し、その型のインスタンスでそのメソッドを呼び出すメソッドを作成しようとしています同じ理由 - コードをコンパイルすることさえできないので、ランタイムチェックを実行する機会は決してありませんでした。 –

関連する問題