Sql server SQL Server 2005-基于对表名的查询从表中删除聚集键的SQL语句?

Sql server SQL Server 2005-基于对表名的查询从表中删除聚集键的SQL语句?,sql-server,navision,dynamics-nav,Sql Server,Navision,Dynamics Nav,我正在尝试恢复Microsoft Dynamics NAV数据库的备份,不幸的是,该备份失败,因为它尝试为已具有群集密钥的表设置群集密钥 在NAV中,数据库中的每个公司都有自己的表副本,前缀为公司名称,例如公司$User\u Setup。因此,我想删除给定公司上的任何集群键,这意味着在任何表上,名称以“company$”开头 有人有可以执行此操作的SQL语句吗?您需要将其作为游标来执行。假设每个PK约束的命名都是一致的,并且基于表名,则可以执行以下操作(未测试,因此可能包含拼写错误或自夸语法错误

我正在尝试恢复Microsoft Dynamics NAV数据库的备份,不幸的是,该备份失败,因为它尝试为已具有群集密钥的表设置群集密钥

在NAV中,数据库中的每个公司都有自己的表副本,前缀为公司名称,例如
公司$User\u Setup
。因此,我想删除给定公司上的任何集群键,这意味着在任何表上,名称以“company$”开头


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

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


如果您的PK不是基于tablename命名的,那么您必须修改此选项,同时基于sysconstraints或sysindexes进行查询,以获得实际的PK名称。

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


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

这样做不行-您只是删除了主键约束-还没有删除索引。此外,虽然默认情况下主键通常是聚集索引,但这不是一个要求-它可以是两个不同的索引。更重要的是:主键(如果它也是聚集索引)通常也由外键关系引用-因此,在删除主键索引之前,也必须删除这些关系。通常,删除PK约束也会删除关联的索引。然而,我承认我做了一些假设来保持它的简单。。。但为了说明解决方案的基础,它确实提供了一个起点。谢谢,我知道我会放弃主键。事实上,我只是在索引上将集群重置为堆。这有可能吗?没有-你必须删除并重新创建索引。如果所有表中的列都是相同的(听起来就像你说的那样,它们得到了一个表的副本),那么你可以在删除约束后扩展游标循环,动态创建非聚集(唯一?)索引。这样做不行——你只是删除了主键约束——还没有删除索引。此外,虽然默认情况下主键通常是聚集索引,但这不是一个要求-它可以是两个不同的索引。更重要的是:主键(如果它也是聚集索引)通常也由外键关系引用-因此,在删除主键索引之前,也必须删除这些关系。通常,删除PK约束也会删除关联的索引。然而,我承认我做了一些假设来保持它的简单。。。但为了说明解决方案的基础,它确实提供了一个起点。谢谢,我知道我会放弃主键。事实上,我只是在索引上将集群重置为堆。这有可能吗?没有-你必须删除并重新创建索引。如果所有表中的列都是相同的(听起来就像您所说的那样,它们得到了表的副本),那么您可以扩展游标循环,在删除约束后动态创建非聚集(唯一?)索引。
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