2011-07-13 186 views
2

查找在飞行主键约束我有以下SQL:在SQL Server 2005

ALTER TABLE dbo.PS_userVariables DROP CONSTRAINT PK_PS_userVariables; 
ALTER TABLE dbo.PS_userVariables ADD PRIMARY KEY (varnumber, subjectID, userID, datasetID, listid, userVarTitle); 

因为我有多个环境中,PK_PS_userVariables约束的名字是我的不同的数据库不同。如何编写一个获取该名称的脚本,然后将其添加到脚本中?

+0

待办事项你想放弃所有的约束条件,还是只有一个? –

+0

我想删除该表上的所有主键,然后添加我的额外主键 – cdub

+0

http://stackoverflow.com/questions/6115451/how-to-generate-all-constraints-scripts,或:http: //sackoverflow.com/search?q=[sql-server]+drop+constraints –

回答

7

而典型的最好的做法是始终明确命名你的约束,你可以从目录视图中动态获取他们:

DECLARE @table NVARCHAR(512), @sql NVARCHAR(MAX); 

SELECT @table = N'dbo.PS_userVariables'; 

SELECT @sql = 'ALTER TABLE ' + @table 
    + ' DROP CONSTRAINT ' + name + ';' 
    FROM sys.key_constraints 
    WHERE [type] = 'PK' 
    AND [parent_object_id] = OBJECT_ID(@table); 

EXEC sp_executeSQL @sql; 

ALTER TABLE dbo.PS_userVariables ADD CONSTRAINT ... 
1
SELECT 
    A.TABLE_NAME, 
    A.CONSTRAINT_NAME, 
    B.COLUMN_NAME 
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS A, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE B 
WHERE 
     CONSTRAINT_TYPE = 'PRIMARY KEY' 
    AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME 
ORDER BY 
    A.TABLE_NAME 

编号:皮纳尔戴夫@http://blog.sqlauthority.com/2008/09/06/sql-server-find-primary-key-using-sql-server-management-studio/

+1

除非您需要严格遵守并迎合跨平台,否则我会提醒您不要使用INFORMATION_SCHEMA视图。在这种情况下,它可能没问题,但是在很多情况下,由于I_S视图没有被维护,所以它们缺少关键信息,无论如何您都需要转到目录视图(例如,索引 - INCLUDE列,过滤器等)。在INFORMATION_SCHEMA中找不到)。 –

+0

@Aaron:我同意,但我更容易更好,当我可以摆脱它时,Info Schema在这种特殊情况下应该可以做得很好,而且无论如何都可以更好地扩展。 – Chains

+0

我比简单的代码更适合一致的代码。学习使用INFORMATION_SCHEMA的人会与那些不包括在这些异常情况下的信息纠缠在一起。无论如何,这个“规模”会更好吗?你的意思是你可以复制精确的代码并在其他RDBMS上运行它?这不是大多数人所称的“规模”,而是“便携性”...... –

1
DECLARE @TableName varchar(128) 
DECLARE @IndexName varchar(128) 
DECLARE @Command varchar(1000) 

SET @TableName = 'PS_userVariables' 

SELECT @IndexName = si.name 
FROM sys.tables st 
JOIN sys.indexes si ON st.object_id = si.object_id 
WHERE st.name = @TableName 
    AND si.is_primary_key = 1 

SET @Command = 'ALTER TABLE dbo.' + QUOTENAME(@Tablename) + ' DROP CONSTRAINT ' + QUOTENAME(@IndexName) + '; 
ALTER TABLE dbo.' + QUOTENAME(@Tablename) + ' ADD PRIMARY KEY (varnumber, subjectID, userID, datasetID, listid, userVarTitle);'