2013-10-20 46 views
1

數據庫是如何以可以在其上執行DML的方式對其表進行枚舉的?我已經從一個單一的語句完成的檢索表名:如何枚舉SQL Server數據庫中的表並執行DML

SELECT TABLE_NAME FROM MyDB.INFORMATION_SCHEMA.TABLES; 

我大部分的表有一個特殊的領域使用相同的名字,我想將它們全部更新,通過表枚舉值相同。數據庫的結構使我無法使用參照完整性進行更新傳播,這是我手動更新的特殊情況。我不知道如何遍歷並更新其中的公共字段,併爲沒有SpecialField的表指定try-catch塊。如:

declare @i int =0; 
While(@i < MyDB.INFORMATION_SCHEMA.TABLES.length) 
begin 
    begin try 
    Update MyDB.INFORMATION_SCHEMA.TABLES[i] set SpecialField= SomeValue; 
    end try 
    begin catch end catch 
    set @[email protected]+1; 
end 

謝謝。

+0

您可以使用MyDB.INFORMATION_SCHEMA.COLUMNS,把一個WHERE子句列名。那樣你就不需要嘗試,對吧? – Martao

回答

2

您必須使用動態SQL,即在字符串(VarChar)中構造UPDATE語句並使用EXEC命令執行該命令。由於我不知道你正在使用的具體RDBMS,所以我不能給你一個例子。但基本上,它看起來與此類似:

declare @cmd VarChar(80) 
declare @i int =0; 
While(@i < MyDB.INFORMATION_SCHEMA.TABLES.length) 
begin 
    begin try 
    set @cmd='Update '+MyDB.INFORMATION_SCHEMA.TABLES[i]; 
    set @[email protected] +' set SpecialField= '+cast(SomeValue as VarChar); 
    exec (@cmd) 
    end try 
    begin catch end catch 
    set @[email protected]+1; 
end 
1

下面是使用sp_MSforeachtable一個解決方案,但我承認,它看起來並不簡單得多。
但是,它直接查找包含該正確列的表。
表格名稱可通過?在聲明中訪問,但格式爲'[dbo].[tablename]'

exec sp_MSforeachtable ' 
    IF ''?'' IN (
     SELECT ''['' + TC.TABLE_SCHEMA + ''].['' + TC.TABLE_NAME + '']'' 
     FROM INFORMATION_SCHEMA.COLUMNS TC 
     WHERE TC.COLUMN_NAME = ''SpecialField'' 
     ) 
    BEGIN 
     EXECUTE sp_executesql N''UPDATE ? SET [SpecialField] = NULL''; 
     PRINT ''? done''; 
    END 
    ELSE 
     PRINT ''? skipped''; 
'; 
1

我完成這種方式,讓其他人可以使用我的代碼:

DECLARE @DBTables TABLE (
    ID int, 
    Name varchar(200) 
); 

with DBTables as 
(
    SELECT Row_Number() over(order by TABLE_NAME) as ID,TABLE_NAME as Name FROM 
              PTBilling.INFORMATION_SCHEMA.TABLES 
) 
insert into @DBTables (ID,Name) select ID,Name from DBTables; 

declare @cmd varchar(1000); 
declare @OldID int =10714; 
declare @NewID int=200; 
declare @ID int =1; 
declare @tableMaxID int=(select max(ID) from @DBTables); 
While(@ID < @tableMaxID) 
begin 
    begin try 
    set @cmd='Update '+ (select top 1 Name from @DBTables where [email protected]); 
    set @cmd= @cmd +' set ID= '+ cast(@NewID as varchar)+ 
        ' where ID=' + cast(@OldID as varchar); 
    exec (@cmd) 
    end try 
    begin catch end catch 
    set @ID = @ID+1; 
end 
相關問題