2016-06-15 21 views
1

我有這樣的代碼(SQL Server 2008中)錯誤,同時通過在SQL Server中的多個表的循環2008

EXEC sp_MSforeachtable 

' 
IF ''?'' LIKE ''%_records%'' 
BEGIN 

Update ? set Status = ''expired'' where expire_date_time <= getdate() 
END' 

當我執行此查詢時,它更新了表,但它顯示如下錯誤:

Msg 207, Level 16, State 1, Line 6 
Invalid column name 'expire_date_time'. 
Msg 207, Level 16, State 1, Line 6 
Invalid column name 'expire_date_time'. 
Msg 207, Level 16, State 1, Line 6 
Invalid column name 'expire_date_time'. 
Msg 207, Level 16, State 1, Line 6 
Invalid column name 'expire_date_time'. 
Msg 207, Level 16, State 1, Line 6 
Invalid column name 'expire_date_time'. 
Msg 207, Level 16, State 1, Line 6 
Invalid column name 'expire_date_time'. 

爲什麼這樣呢?有人可以用正確的代碼指導我嗎?我想把這個代碼放在事件中,所以它會在特定的時間間隔後檢查條件。

+1

是否每個包含名爲'_records_'的表都有'expire_date_time'列? – Lamak

+0

我會冒險猜測這是因爲在幾個數據庫中沒有名爲「expire_date_time」的列。 –

+0

是的。例如:username_records,如果用戶名是jason,那麼tablename是jason_records。每個表都有expire_date_time列。 –

回答

0

使用TRY/CATCH和RAISE(或THROW)陷阱錯誤包含表名(?)的自定義錯誤消息,然後您將知道哪個表缺少該列。

+0

我的問題是,它在表中執行所需的更新,但之後顯示錯誤。我在數據庫中只放置了2-3個表格來測試一切都是完美的,根本沒有錯別字。 –

+0

嗯,這是我所期望的。你的代碼在每個表上運行,當它找到該列時,它就起作用,而當它不起作用時,就會引發該錯誤。那麼爲什麼這是一個問題? –

0

問題是,IF語句不會做任何事情來阻止SQL Server解析命令。例如,請嘗試:

IF 1=0 
BEGIN 
    SELECT blah FROM INFORMATION_SCHEMA.TABLES 
END 

您仍然會收到錯誤消息。

此外,具有類似於jason_records表是一個非常可怕的想法。

,你可以做到這一點的另一種方法是隻能做UPDATE動態代碼:

DECLARE 
    @table_name SYSNAME, 
    @table_schema SYSNAME, 
    @sql   NVARCHAR(MAX) 

DECLARE CURSOR tables_cursor FOR 
SELECT TABLE_SCHEMA, TABLE_NAME 
FROM 
    INFORMATION_SCHEMA.TABLES T 
INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON 
    C.TABLE_CATALOG = T.TABLE_CATALOG AND 
    C.TABLE_SCHEMA = T.TABLE_SCHEMA AND 
    C.TABLE_NAME = T.TABLE_NAME AND 
    C.COLUMN_NAME = 'expire_date_time' 
WHERE 
    T.TABLE_NAME LIKE '%_records' 

OPEN tables_cursor 

FETCH NEXT FROM tables_cursor INTO @table_schema, @table_name 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SELECT @sql = 'UPDATE ' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ' SET status = 'expired' WHERE expire_date_time <= GETDATE()' 

    EXEC (@sql) 

    FETCH NEXT FROM tables_cursor INTO @table_schema, @table_name 
END 

CLOSE tables_cursor 

DEALLOCATE tables_cursor 
+0

我的問題是,它在表中執行所需的更新,但之後顯示錯誤。我在數據庫中只放置了2-3個表格來測試一切都是完美的,根本沒有錯別字。 –

0

不幸sp_MSforeachtable是不支持的代碼。它可能包含將永遠不會被糾正的錯誤。嘗試[]

... 
update ? set [Status] = ''expired'' where [expire_date_time] <= getdate() 
...