2011-08-31 122 views
0

我有工作正常,但是當它到達腳本的這一部分,似乎仍然運行更新,即使表不存在光標:IF EXISTS在SQL Server遊標不工作

SET @sql = 'IF (EXISTS (SELECT * FROM ps_vars_' + @datasetid + ')) 
      BEGIN 
    UPDATE ps_vars_' + @datasetid + ' 
    SET programming_notes = replace(programming_notes, ''Some of the variables listed are source variables.'') 
     END'; 

    EXEC SP_EXECUTESQL @sql 

我錯過了什麼? #datasetid變量也會正確傳入。

+0

這應該只是產生一個錯誤,因爲該對象不存在...是否有錯誤陷阱否則在過程中的位置? – JNK

+0

它應該做什麼?似乎很奇怪,你會檢查表是否有任何行,如果是的話更新全部。 「IF」是否意味着表格存在檢查而不是「有行」檢查? –

+0

我試圖得到它,所以如果對象不存在,它會忽略它。我如何捕獲錯誤? – cdub

回答

2
DECLARE @tablename sysname 

SET @tablename = 'ps_vars' + @datasetid 

IF (OBJECT_ID(@tablename, 'U') IS NOT NULL) 
BEGIN 
SET @sql = ' UPDATE ' + QUOTENAME(@tablename) + ' 
    SET programming_notes = replace(programming_notes, ''Some of the variables listed are source variables.'') '; 
    EXEC sp_executesql @sql 
END 
1

當您使用帶表名稱的EXISTS來查看該表是否存在時,您實際上是在嘗試訪問該表 - 該表不存在。這就是爲什麼你得到一個錯誤,而不是因爲你的聲明UPDATE

試試這個:

SET @sql = 'IF (OBJECT_ID(''ps_vars_' + @datasetid + ''') IS NOT NULL) 
    BEGIN 
     UPDATE ... 
    END' 

後來想想可能是什麼錯了你的數據庫設計,需要你使用動態SQL這樣的。也許你的設計正是它的需求,但根據我的經驗,10次中的9次(可能更多)這種代碼是一個糟糕設計的症狀。