TRUNCATE多个表SQL Server 2014

时间:2016-06-19 14:07:48

标签: sql-server

我想截断多个表。我知道,DELETE将从多个表中删除行的方式不可行。

在这个问题中truncate multi tables IndoKnight提供OP指定的最佳答案。我想尝试一下。但是,我在以下位置收到语法错误:

TRUNCATE TABLE @tableName

要解决问题,我尝试打印变量,因为当我第一次尝试使用TRUNCATE TABLE时,我需要包含数据库名称和架构(例如NuggetDemoDB.dbo.tablename)以使其工作。我可以打印变量@tableList。但我无法打印@tableName

DECLARE @delimiter CHAR(1),
    @tableList VARCHAR(MAX),
    @tableName VARCHAR(20),
    @currLen INT

SET @delimiter = ','

SET @tableList = 'Employees,Products,Sales'
--PRINT @tableList

WHILE LEN(@tableList) > 0
BEGIN
SELECT @currLen = 
(
    CASE charindex( @delimiter, @tableList ) 
        WHEN 0 THEN len( @tableList  ) 
        ELSE ( charindex( @delimiter, @tableList  ) -1 )
    END
)

SET @tableName = SUBSTRING (@tableList,1,@currLen )
--PRINT @tableName
TRUNCATE TABLE @tableName

SELECT tableList = 
(
    CASE ( len( @tableList ) - @currLen  ) 
        WHEN 0 THEN '' 
        ELSE right( @tableList, len( @tableList ) - @currLen  - 1 ) 
    END
) 
END

编辑:修复了表格列表以删除额外的"销售"从表格列表中添加"员工"。

4 个答案:

答案 0 :(得分:2)

首先,您可能需要花费一点精力来提出一个SQL实现来将字符串拆分成行,例如SplitList等。这不仅有助于此练习,也有助于其他许多练习。然后这篇文章不是关于如何将逗号分隔列表转换为行,然后我们可以专注于所需的动态SQL,以便做所需的事情。

示例

下面的示例假设您有一个名为List的函数来处理将逗号分隔列表转换为行。

declare
    @TableList varchar(max) = 'Sales, Products, Sales';

declare
    @Sql varchar(max) = (
        select distinct 'truncate table ' + name + ';'
        from List(@TableList)
        for xml path(''));

exec (@Sql);

关于截断删除的最后一件事

如果要截断与另一个表存在外键关系的数据,则截断将不起作用。

您将收到以下错误。

Msg 4712, Level 16, State 1, Line 19
Cannot truncate table 'Something' because it is being referenced by a FOREIGN KEY constraint.

答案 1 :(得分:1)

甚至认为销售额列出两次......没有坏处

Declare @TableList varchar(max)
SET @tableList = 'Sales,Products,Sales'
Set @tableList = 'Truncate Table '+replace(@tablelist,',',';Truncate Table ')+';'
Print @TableList

--Exec(@tablelist)  --<< If you are TRULY comfortable with the results

返回

Truncate Table Sales;Truncate Table Products;Truncate Table Sales

答案 2 :(得分:1)

下面是一个使用表变量而不是分隔列表的示例。如果表列表的源已经在表中,则可以调整此脚本以将其用作源。请注意,额外的Sales表是多余的(从您的问题的脚本中收集)并且可以删除。如果需要,表名可以是数据库和/或模式限定。

DECLARE @tableList TABLE(TableName nvarchar(393));
DECLARE @TruncateTableBatch nvarchar(MAX);
INSERT INTO @tableList VALUES
      (N'Sales')
    , (N'Products')
    , (N'Sales');

SET @TruncateTableBatch = (SELECT N'TRUNCATE TABLE ' + TableName + N'
'
FROM @tableList
FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)');

--PRINT @SQL;
EXECUTE(@TruncateTableBatch);

答案 3 :(得分:0)

如下:

exec sp_msforeachtable  @ command1 =&#39;截断表?&#39; ,@ whereand =&#39; and object_id In(从sys.objects中选择object_id,其中的名称在(&#34; sales&#34;,&#34; products&#34;)&#39;

尚未测试过。但它可能会提供一个有用的提示。