2016-06-12 79 views
-2

我打算在T-SQL中編寫存儲過程以截斷特定數據庫和模式中的表。在數據庫中截斷表T-SQL存儲過程

這個想法是將所有表名存儲在一個表中。該表有4列,這些列是數據庫名稱,模式名稱,表名稱和標誌。

如果標誌值設置爲0,則存儲過程應截斷所有這些表。

有人可以對此有所瞭解嗎?

+4

如果這是你需要做什麼,然後去做。您需要使用動態SQL,可能需要使用遊標。你真正的問題是什麼? –

+0

是的,我正在這樣做。想從專家那裏得到更多的見解 – user1254579

+2

所以,如果你有一些關於某個部分的具體問題,請回來問一下。 –

回答

1

假設你有您儲存的表的細節被截斷的表稱爲@tables,您可以使用下面的邏輯/光標您的存儲過程中截斷這些表。

表控股表信息

DECLARE @Tables TABLE (DBName SYSNAME , SchemaName SYSNAME 
        ,TableName SYSNAME, Flag INT); 
INSERT INTO @Tables VALUES 
('TestDB' , 'dbo', 'TestTable1', 0), 
('TestDB' , 'dbo', 'TestTable2', 0), 
('TestDB' , 'dbo', 'TestTable3', 1) 

存儲過程代碼

Declare @DB  SYSNAME 
     , @Schema SYSNAME 
     , @Table SYSNAME 
     , @Sql VARCHAR(MAX); 


Declare Cur CURSOR LOCAL FAST_FORWARD FOR 
SELECT DBName , SchemaName , TableName 
FROM @Tables 
WHERE Flag = 0 

OPEN Cur 
    FETCH NEXT FROM Cur INTO @DB , @Schema , @Table 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 

SET @Sql = N'TRUNCATE TABLE ' 
      + QUOTENAME (@DB) + '.' + QUOTENAME (@Schema) + '.' + QUOTENAME (@Table) 

    Exec sp_executesql @Sql 

    FETCH NEXT FROM Cur INTO @DB , @Schema , @Table 

END 

CLOSE Cur 
DEALLOCATE Cur 
1

也許這樣的事情

Declare @Table table (dbname varchar(50),schem varchar(50),tablename varchar(50),flag bit) 
Insert into @Table (dbname,schem,tablename,flag) values 
('dbName1','dbo','MyTable1',0), 
('dbName2','dbo','MyTableA',1), 
('dbName1','dbo','MyTableB',0), 
('dbName2','dbo','MyTableZ',1), 
('dbName1','dbo','MyTable2',0) 


Declare @SQL varchar(max) = '' 
Select @SQL = coalesce(@SQL,' ') + ';truncate table [' +dbname +'].[' + schem +'].[' + tablename +']' 
From @Table 
Where Flag=1 

Select @SQL 
--Exec(@SQL)