截断数据库T-SQL存储过程中的表

时间:2016-06-12 14:42:18

标签: sql sql-server tsql stored-procedures

我打算在T-SQL中编写一个存储过程来截断特定数据库和模式中的表。

想法是将所有表名存储在表中。该表有4列,分别是数据库名称,模式名称,表名称和标志。

如果标志值设置为0,则存储过程应截断所有这些表。

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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