2016-06-12 65 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)