2013-05-16 107 views
0

我有以下修改..如何調整TSQL代碼以僅截斷dim模式的表?

DECLARE @tablename AS VARCHAR (1000) 
DECLARE @sql AS VARCHAR (1000) 

IF OBJECT_ID('tempdb.dbo.#tables') IS NOT NULL 
    DROP TABLE #tables 

SELECT * 
INTO #tables 
FROM sys.tables 

WHILE EXISTS (SELECT * 
       FROM #tables) 
    BEGIN 
     SELECT @tablename = name 
     FROM #tables 
     SELECT @sql = 'truncate table ' + @tablename; 
     PRINT @sql 
     EXECUTE (@sql) 
     DELETE #tables 
     WHERE name = @tablename; 
    END 

上面的代碼將截斷在數據庫中,所有表這正是我需要的,但是我只希望這對那些的「暗淡」的一部分工作表架構。

舉個例子,我有以下的表..

dbo.sales dim.employee dim.office

我想腳本只截斷「暗淡」模式表以及不是dbo.sales表。

這是假設我沒有任何PK/FK(因爲我有另一個代碼處理PK/FK的drop/create)。

任何幫助,將不勝感激。

謝謝。

+5

呃,'FROM SYS.TABLES WHERE SCHEMA_NAME([schema_id]) = N'dim';'? –

回答

0
SELECT SCHEMA_NAME(schema_id) + '.' + name as name 
INTO #tables 
FROM sys.tables 
where SCHEMA_NAME(schema_id) = 'dim' 
+0

我添加了您的建議,但現在顯示.. Msg 4701,Level 16,State 1,Line 1 找不到對象「ITEM_PACK_SIZE」,因爲它不存在或您沒有權限。 – exxoid

+0

這是你的'昏暗'模式中的表的名稱? – Peter

+0

是的,表名dim.ITEM_PACK_SIZE我認爲問題在於它不解析「昏暗」。在最終的截斷表TSQL中。 – exxoid

1

嘗試這一個 -

查詢:

DECLARE @SQL NVARCHAR(MAX) = '' 

SELECT @SQL = (
    SELECT 'TRUNCATE TABLE [' + s.name + '].[' + o.name + ']' + CHAR(13) 
    FROM sys.objects o WITH (NOWAIT) 
    JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id] 
    WHERE o.[type] = 'U' 
     AND s.name = 'dim' 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 

PRINT @SQL 

EXEC sys.sp_executesql @SQL 

輸出:

TRUNCATE TABLE [dim].[test1] 
TRUNCATE TABLE [dim].[test2] 
TRUNCATE TABLE [dim].[test3] 
TRUNCATE TABLE [dim].[test4] 
...