我打算在T-SQL中编写一个存储过程来截断特定数据库和模式中的表。
想法是将所有表名存储在表中。该表有4列,分别是数据库名称,模式名称,表名称和标志。
如果标志值设置为0,则存储过程应截断所有这些表。
有人可以对此有所了解吗?
答案 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