2012-02-17 35 views
1

的代碼,我可以使用syscomments表中的存儲過程的代碼。SQL Server的我怎樣才能得到一個外鍵約束

select so.name, sc.text as storedproccode 
from sysobjects so (nolock) 
inner join syscomments sc (nolock) on sc.id = so.id 
where so.name = 'tablename' 

如何獲取特定外鍵約束的代碼?我有外鍵名稱。

讓我澄清一下我在尋找。

我發現我在對象資源管理器表和擴大密鑰列表。如果有主鍵,我可以右鍵單擊主鍵約束並在新窗口中調出腳本。

的代碼看起來是這樣的:

USE [Gemini] 
GO 
/****** Object: Index [PK_CM_FULFILLMENT_HISTORY] Script Date: 02/17/2012 16:50:23 ******/ 
ALTER TABLE [dbo].[CM_FULFILLMENT_HISTORY] ADD CONSTRAINT [PK_CM_FULFILLMENT_HISTORY] PRIMARY KEY NONCLUSTERED 
(
    [pan] ASC, 
    [RequestCode] ASC, 
    [RequestDate] ASC 
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [GEMINI_12_Indx_FG] 

我還可以與外鍵約束做到這一點。

有沒有辦法以檢索這些約束的代碼(腳本)?

感謝

+0

我不認爲它是存儲爲一個字符串,該值存儲在系統表。約束的靈活性較少,因此可以進行規範化。 – JNK 2012-02-17 21:48:27

+0

請看這個問題 - 我的答案涉及瞭解幾種不同的依賴關係,包括外鍵。正如其他人所述,SQL Server不會在任何地方存儲'ALTER TABLE'腳本。 http://stackoverflow.com/questions/6557038/find-tables-that-a-particular-table-depends-on-in-sql-server – 2012-02-17 22:03:17

回答

0

我發現了一個腳本,它的伎倆。

Declare  @dbname varchar(128) 
      , @tablename varchar(128) 
      , @query nvarchar(4000) 


select @dbname = 'gemini' 
     , @tablename = 'cm_fulfillment_house' 


SET @QUERY = 
'USE ' + @DBNAME + ' 


SELECT CAST(F.NAME AS VARCHAR(255)) AS ForeignKeyName, 
CAST(c.name as varchar(255)) AS ForeignTable, 
CAST(fc.name as varchar(255)) AS ForeignColumn, 
cast(fc2.name as varchar(255)) as ForeignColumn2, 
CAST(p.name as varchar(255)) AS PrimaryTable, 
CAST(rc.name as varchar(255)) AS PrimaryColumn, 
cast(rc2.name as varchar(255)) as PrimaryColumn2 
INTO #GetFKConstraints 
FROM SYSOBJECTS F 
INNER JOIN SYSOBJECTS C ON F.PARENT_OBJ = C.ID 
INNER JOIN SYSREFERENCES R on F.ID = R.CONSTID 
INNER JOIN SYSOBJECTS P ON R.RKEYID = P.ID 
INNER JOIN SYSCOLUMNS RC ON R.RKEYID = RC.ID AND R.RKEY1 = RC.COLID 
INNER JOIN SYSCOLUMNS FC ON R.FKEYID = FC.ID AND R.FKEY1 = FC.COLID 
left join syscolumns rc2 on r.rkeyid = rc2.id and r.rkey2 = rc.colid 
left join syscolumns fc2 on r.fkeyid = fc2.id and r.fkey2 = fc.colid 
WHERE F.TYPE = '+'''F'''+'' 

select @query = @query + ' and c.name = ''' + @tablename + '''' 

+ ' 

--SELECT * from #GetFKConstraints'+' 

SELECT ' + '''ALTER TABLE ''' + '+ ForeignTable + ' + ''' 
DROP CONSTRAINT ''' + '+ ForeignKeyName 
FROM #GetFKConstraints 
ORDER BY ForeignTable' 
+' 

SELECT ' + '''ALTER TABLE ''' + '+ ForeignTable +' + ''' 
ADD CONSTRAINT ''' + '+ ForeignKeyName +' 
+ ''' FOREIGN KEY ('''+ ' + ForeignColumn + '+ ''') 
REFERENCES ''' + '+ PrimaryTable + ' + '''(''' + '+ PrimaryColumn + '+ ''')''' + 
'FROM #GetFKConstraints 
ORDER BY ForeignTable 
' 
select @query 

EXEC (@QUERY) 
GO 
1

我怎樣才能得到一個特定的外鍵約束的代碼?

你不能因爲它不存在。 Forein鍵配置被配置,然後管理信息被保存在表中,但是沒有運行的「代碼」。

如果你看一下INFORMATION_SCHEMA,你會發現你可以找出存在什麼約束以及它們是指什麼。但是沒有「代碼」。當你創建一個外鍵約束時,在描述約束的約束表中進行配置條目。 FK constriaint不是存儲過程。

1

看看sys.foreign_keyssys.foreign_key_columns。前者會告訴你列中的外鍵,而後者會告訴你哪些列在哪個外鍵中。