0

我有以下要修改的..

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

上面的代码将截断数据库中的所有表,这是我需要的,但是我只希望它适用于属于“dim”模式的表。

例如,我有以下表格..

dbo.sales dim.employee dim.office

我希望脚本只截断“dim”模式表,而不是 dbo.sales 表。

这是假设我没有任何 PK/FK(因为我有另一个代码处理 PK/FK 的删除/创建)。

任何帮助,将不胜感激。

谢谢。

4

2 回答 2

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]
...
于 2013-05-17T05:18:34.507 回答
0
SELECT SCHEMA_NAME(schema_id) + '.' + name as name 
INTO   #tables
FROM   sys.tables
where SCHEMA_NAME(schema_id) = 'dim'
于 2013-05-16T20:22:26.563 回答