【问题标题】:Delete records dynamically from a SQL Server table从 SQL Server 表中动态删除记录
【发布时间】:2018-12-01 19:20:08
【问题描述】:

我有一个名为Name_Tables 的表,其中包含其他表的名称。

其中一些表的名称类似于 dbo.companyname.test 和其他的 dbo.testtest

对于表Name_Tables中提到的所有这些表,我想删除数据,这样我就有了空表。我想通过使用动态 SQL 来做到这一点。

我的代码是可执行的,我可以删除一些记录,但不是全部。也许你知道我的错误在哪里......

DECLARE @i INT = 1
DECLARE @count INT = 50
DECLARE @tablename NVARCHAR(MAX)
DECLARE @sql NVARCHAR(MAX)
DECLARE @value NVARCHAR (MAX)`

WHILE(@i <= @count)
BEGIN       
    SET @tablename = (SELECT TOP (1) Expression FROM Name_Tables WHERE Id = @i);

    IF EXISTS (SELECT '[dbo].[company$'+@tablename+']')
    BEGIN
        SET @sql = N'DELETE FROM [dbo].[company$'+@tablename+']';

        EXECUTE sp_executesql @sql;
    END
    ELSE IF EXISTS (SELECT '[dbo].[' + @tablename+']')
    BEGIN
        SET @sql = N'DELETE FROM [dbo].[' + @tablename+']';
        EXECUTE sp_executesql @sql;
    END
    ELSE
    BEGIN
        SET @i += 1;
    END

    SET @i += 1
END

【问题讨论】:

  • 有人会争辩说,您的根本问题是将相同的数据存储在不同的表中,仅以公司名称区分。您应该修复数据模型。
  • 表之间是否有任何外键引用可能需要处理表的特定顺序,例如在删除他们的Orders 之前,您不能删除Customers

标签: sql-server dynamic sql-delete sp-executesql


【解决方案1】:

我是否建议使用游标查询 - 这是我之前制作的一个,您可以根据自己的目的进行修改。

SQL Server view - bad naming convention?

【讨论】:

    【解决方案2】:

    如果你的 delete 语句没有 Where 子句,那么它应该从表中删除所有记录。什么是错误。打印您使用动态 SQL 循环准备的 SQL 语句。并尝试在 SSMS 中执行。 如果有错误,请分享。

    【讨论】:

      【解决方案3】:

      非常感谢您帮助我编写代码。我发现,我只需要删除最后一个 else 分支并将 else-if 分支更改为 else 分支。现在它工作正常:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多