我正在尝试恢复 Microsoft Dynamics NAV 数据库的备份,但不幸的是,它失败了,因为它尝试为已经具有集群键的表设置集群键。
在 NAV 中,数据库中的每家公司都有自己的表格副本,并以公司名称为前缀,例如COMPANY$User_Setup
. 因此,我想删除给定公司上的任何聚集键,这意味着在任何名称以“Company $”开头的表上。
有没有人有可以执行此操作的 SQL 语句?
我正在尝试恢复 Microsoft Dynamics NAV 数据库的备份,但不幸的是,它失败了,因为它尝试为已经具有集群键的表设置集群键。
在 NAV 中,数据库中的每家公司都有自己的表格副本,并以公司名称为前缀,例如COMPANY$User_Setup
. 因此,我想删除给定公司上的任何聚集键,这意味着在任何名称以“Company $”开头的表上。
有没有人有可以执行此操作的 SQL 语句?
您需要将其作为光标进行。假设每个 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 不是基于表名命名的,那么您必须修改它以也基于 sysconstraints 或 sysindexes 查询以获取实际的 PK 名称。