2016-09-01 51 views
2

我需要執行下面的邏輯子句:牛逼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 CATCH塊和動態SQL的方式,使下面的代碼塊將不表config和/或在數據庫中legacyoptions字段進行編譯。

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列丟失的數據庫上運行時。如果我評論第二個如果出來,它工作正常,但這是問題本身。 – 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

爲什麼你看起來很愚蠢?你熟悉其他編程語言嗎?原始代碼類似於另一種語言,試圖編寫一種方法,首先使用反射/自省來確定某個特定類型是否包含特定方法,然後在該類型的實例上調用該方法 - 並且該方法失敗同樣的原因 - 它甚至無法編譯代碼,所以它從來沒有機會執行它的運行時檢查。 –

相關問題