Sql server 截断多个表SQL Server 2014

Sql server 截断多个表SQL Server 2014,sql-server,Sql Server,我想截断多个表。我知道DELETE将从多个表中删除行的方式是不可能的 在这个问题上,IndoKnight提供了OP指定的最佳答案。我想试试。但是,我在以下位置遇到语法错误: TRUNCATE TABLE @tableName 为了排除故障,我尝试打印变量,因为当我第一次尝试使用TRUNCATE TABLE时,我需要包含数据库名称和模式,例如NuggetDemoDB.dbo.tablename,以使其正常工作。我可以打印变量@tableList。但是我不能打印@tableName 编辑:修复了表

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

在这个问题上,IndoKnight提供了OP指定的最佳答案。我想试试。但是,我在以下位置遇到语法错误:

TRUNCATE TABLE @tableName
为了排除故障,我尝试打印变量,因为当我第一次尝试使用TRUNCATE TABLE时,我需要包含数据库名称和模式,例如NuggetDemoDB.dbo.tablename,以使其正常工作。我可以打印变量@tableList。但是我不能打印@tableName


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

即使销售列表已列出两次。。。无害

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

即使销售被列了两次。。。无害

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

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

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);

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

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);

比如说:

exec sp_msforeachtable @command1='truncate table?' ,@wherend='和object_id,从sys.objects中选择object_id,其中销售、产品中的名称'


我还没有测试过它。但它可能会给出一个有用的提示。

下面的例子怎么样:

exec sp_msforeachtable @command1='truncate table?' ,@wherend='和object_id,从sys.objects中选择object_id,其中销售、产品中的名称'


我还没有测试过它。但是,它可能会给出一个有用的提示。

首先,你可能需要考虑花费一点精力来生成一个SQL实现,将一个字符串分割成行,例如分割、列表等。这不仅对这个练习有帮助,而且对许多其他人也有帮助。这篇文章不是关于如何将逗号分隔的列表转换成行,然后我们可以专注于所需的动态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);
关于delete的截断的最后一件事

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

您将得到如下错误

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

首先,您可能需要考虑花费一点精力来生成一个SQL实现,用于将一个字符串分割成行,例如拆分、列表等。这将证明不仅有助于此练习,而且对许多其他人也有帮助。这篇文章不是关于如何将逗号分隔的列表转换成行,然后我们可以专注于所需的动态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);
关于delete的截断的最后一件事

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

您将得到如下错误

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

您不能参数化标识符。我有点惊讶没有人写这篇文章来评论你链接到的答案。您必须为每个表使用不同的Truncate语句,或者使用动态sql。您需要使用一点动态sql来迭代每个表。实际上,您可以自动化表列表。sys.objects和sys.tables是很好的起点。使用QUOTENAME,“[]”不能参数化标识符。我有点惊讶没有人写这篇文章来评论你链接到的答案。您必须为每个表使用不同的Truncate语句,或者使用动态sql。您需要使用一点动态sql来迭代每个表。实际上,您可以自动化表列表。sys.objects和sys.tables是很好的起点。使用QUOTENAME,“[]”回答不错,尽管没有完整性检查。不过,我觉得我们需要知道谁在使用这个程序以及为什么。答案不错,尽管没有完整性检查。不过,我觉得我们需要知道谁在使用这个过程以及为什么。另外:如果您在尝试截断时有几个外键冲突,您可以使用脚本生成create语句,将它们存储到tempdb,删除外键,截断并从tempdb还原外键。另外,在截断时可以保持表的正确顺序。您可以查看外键的删除级联。也许是有趣的
g对您来说:附加:如果您在尝试截断时有两个外键冲突,您可以使用脚本生成create语句,将它们存储到tempdb,删除外键,截断并从tempdb还原外键。另外,在截断时可以保持表的正确顺序。您可以查看外键的删除级联。也许这对你来说很有趣: