2011-07-13 229 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);'