【问题标题】:SQL Server 2005 - SQL Statement to remove clustered keys from tables based on a query on tablenames?SQL Server 2005 - 基于对表名的查询从表中删除聚集键的 SQL 语句?
【发布时间】:2009-08-03 13:43:01
【问题描述】:

我正在尝试恢复 Microsoft Dynamics NAV 数据库的备份,但由于它尝试为已具有集群键的表设置集群键而失败。

在 NAV 中,数据库中的每家公司都有自己的表格副本,并以公司名称为前缀,例如COMPANY$User_Setup。因此,我想删除给定公司上的任何聚集键,这意味着在名称以“Company$”开头的任何表上。

有人有可以执行此操作的 SQL 语句吗?

【问题讨论】:

    标签: sql-server navision dynamics-nav


    【解决方案1】:

    您需要将其用作光标。假设每个 PK 约束的命名一致并且基于表名,您可以执行以下操作(未经测试,因此可能包含拼写错误或 vauge 语法错误):

    DECLARE mycursor CURSOR FOR SELECT name FROM sysobjects WHERE name LIKE 'Company$%'
    
    OPEN CURSOR
    FETCH NEXT FROM mycursor INTO @tablename
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sql = N'ALTER TABLE QUOTENAME(' + @tablename + ') DROP CONSTRAINT PK_' + @tablename 
        EXEC sp_ExecuteSQL @sql
        FETCH NEXT FROM mycursor INTO @tablename
    END
    
    CLOSE CURSOR
    DEALLOCATE CURSOR
    

    如果您的 PK 不是基于 tablename 命名的,那么您必须修改它以也基于 sysconstraints 或 sysindexes 查询以获得实际的 PK 名称。

    【讨论】:

    • 那行不通-您只是删除了主键约束-还没有删除索引。此外,虽然默认情况下主键通常是聚集索引,但这不是必需的 - 它可以是两个不同的索引。甚至更多:主键(如果它也是聚集索引)通常也被外键关系引用 - 所以在删除主键索引之前也必须删除这些关系。
    • 通常删除 PK 约束也会删除关联的索引。但是,我承认为了保持简单而做出了一些假设……但为了说明解决方案的基础,它确实提供了一个起点。
    • 谢谢,我知道我会放弃主键。事实上,我只是在索引上将 CLUSTERED 重置为 HEAP。这有可能吗?
    • 否 - 您必须删除并重新创建索引。如果所有表中的列都相同(听起来就像您所说的那样,它们获得了表的副本),那么您可以扩展游标循环以创建非集群(唯一?)索引 on-放弃约束后的飞蝇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2018-03-10
    相关资源
    最近更新 更多