2014-07-17 99 views
0

我試圖通過檢查密鑰是否已經存在,插入一個外鍵到多個表中,如果沒有,它應該插入它。 但是,當我嘗試運行腳本時,即使所有單個命令都正常工作,它也會跳過整個插入部分。 (我用的MS SQL Server 2008中)如何用IF EXISTS/IF NOT EXISTS語句添加外鍵?

begin transaction; 

declare @isid as nvarchar(50); 
declare @fk as nvarchar(50); 
declare @statement as VARCHAR(2000); 

declare @db_cursor CURSOR; 
set @db_cursor = cursor FOR SELECT Name FROM [sys.Component] order by Name; 

open @db_cursor; 
fetch next from @db_cursor into @isid; 

while @@FETCH_STATUS = 0 
begin 
    SELECT @fk = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    WHERE CONSTRAINT_NAME = 'FK_' + @isid + '_Firma'; 
    if not exists (select @fk) 
     begin 
     print 'NULL: ' + @fk; 
     select @statement = 'ALTER TABLE ' + @isid + ' add constraint FK_' + 
      @isid + '_Firma FOREIGN KEY(FirmaCode) REFERENCES Firma(FirmaCode)'; 
     exec(@statement); 
    end 
    print 'NOT NULL: ' + @fk; 
    fetch next from @db_cursor into @isid; 
end 
close @db_cursor; 

commit transaction; 

基本輸出我得到的是 'NOT NULL: FK_<TableName>_Firma'

感謝您的幫助,您可以與我的問題提供。

+0

最終你試圖FK的添加到您的所有數據庫表(我假設根據您上面的代碼每個人都有FirmaCode列)時不存在。我對嗎? – knkarthick24

+0

@ knkarthick24並不是所有的表都有FirmaCode列,但是那些在sys.Component裏面,所以基本上我做insert語句的表都有FirmaCode列。其中一些已經有了外鍵,所以爲了避免錯誤,我首先檢查哪一列沒有外鍵。 – Edward

回答

0

嘗試

begin transaction; 

declare @isid as nvarchar(500); 
declare @fk as nvarchar(500); 
declare @statement as VARCHAR(2000); 

declare @db_cursor CURSOR; 
set @db_cursor = cursor FOR SELECT Name FROM [sys.Component] order by Name; 

open @db_cursor; 
fetch next from @db_cursor into @isid; 

while @@FETCH_STATUS = 0 
begin 
select @fk = null 
    SELECT @fk = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    WHERE CONSTRAINT_NAME = 'FK_' + @isid + '_Firma'; 
    if (@fk is null) 
     begin 
     print 'NULL: ' + @fk; 
     select @statement = 'ALTER TABLE ' + @isid + ' add constraint FK_' + 
      @isid + '_Firma FOREIGN KEY(FirmaCode) REFERENCES Firma(FirmaCode)'; 
     exec(@statement); 
    end 
    print 'NOT NULL: ' + @fk; 
    fetch next from @db_cursor into @isid; 
end 
close @db_cursor; 

commit transaction; 
+0

這似乎工作,雖然輸出看起來相同,但略有不同http://i.gyazo.com/368039147fe3d0d567e35498d88adcb3.png 即使在您的代碼中,它應該運行此語句「print'NULL:'+ @fk; 「 我在輸出中看不到 – Edward

+0

嘗試打印'NULL:'+'FK_'+ @isid +'_Firma'而不是「print'NULL:'+ @fk;」 – SaravanaC

+0

這個答案給了我我需要的結果,但不是預期的輸出結果,但這個答案對我來說效果不大,非常感謝你SaravanaC – Edward