我想截断多个表。我知道,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
编辑:修复了表格列表以删除额外的"销售"从表格列表中添加"员工"。
答案 0 :(得分:2)
首先,您可能需要花费一点精力来提出一个SQL实现来将字符串拆分成行,例如Split
,List
等。这不仅有助于此练习,也有助于其他许多练习。然后这篇文章不是关于如何将逗号分隔列表转换为行,然后我们可以专注于所需的动态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;
尚未测试过。但它可能会提供一个有用的提示。