2017-03-11 85 views
0

我一直在谷歌搜索和搜索一段時間,但似乎無法找到我的問題的具體答案。我試圖構建一個存儲過程,當我調用該表名稱時,將從特定表中刪除一個主鍵。這是我到目前爲止有:如何在SQL Server存儲過程中使用動態構建的PK

CREATE PROCEDURE DropPrimaryKeys 
    @dbname varchar(max), 
    @schema varchar(max), 
    @tablename varchar(max) 
AS 
    DECLARE @constraint varchar(max) 
    SET @constraint = 'PK_' + UPPER(@tablename) 

    EXECUTE ('alter table ' + @dbname + '.' + 
    @schema + '.' + @tablename + '  drop constraint ' + @constraint) 
GO 

EXEC DropPrimaryKeys 'my_database', 'dbo', 'my_table' 

當我在我的存儲過程,爲@schema,@tablename,@dbname和@constraint只返回值運行SELECT聲明,而不是EXEC,所有的變量按預期出現。但是,當我運行該腳本,它似乎並沒有認識到我的主鍵的名稱由@constraint變量保持的值:

消息3728,級別16,狀態1,行1
「PK_PURCHASEORDER」不是一個約束。

消息3727,級別16,狀態0,行1
無法刪除約束。查看以前的錯誤。

我不知道爲什麼它不識別PK名稱。當它不在存儲過程中時,我已經能夠成功運行此腳本。我似乎只要嘗試運行EXEC就會出現此錯誤。有什麼建議?謝謝!

+1

如果我可能會問,怎麼回事,你發現自己的不快位置不僅有規則,但以至於你想有一個過程來做到這一點不只是爲一個特定的表刪除主鍵,但對於任何表?代碼可以寫,肯定。但是如果我面對它,我會懷疑這是否真的是我想要的道路。 (爲了批量加載的目的,我有時會丟棄密鑰,但好處並不像文檔所建議的那麼好。) –

+0

@ JamesK.Lowden您是對的。不幸的是,我必須這樣做才能批量加載特定的表格。 – happygostacie

+1

然後禁用主鍵索引。 [MSDN - 禁用索引和約束](https://msdn.microsoft.com/en-us/library/ms177456(v = sql.110).aspx) –

回答

1

我認爲你連接的約束名稱可能是問題。 從元數據表中選取約束名稱。

GO 
ALTER PROCEDURE DropPrimaryKeys 
     @dbname varchar(max) 
    , @schema varchar(max) 
    , @tablename varchar(max) 

    AS 
BEGIN 
DECLARE @constraint varchar(max) 
--SET @constraint = 'PK_' + UPPER(@tablename) 
SELECT @constraint =name FROM SYS.key_constraints 
WHERE OBJECT_ID(@tablename)=parent_object_id 


EXECUTE ('alter table ' + @dbname + '.' + 
    @schema + '.' + @tablename + '  drop constraint ' + @constraint) 
END 
GO 
+0

該腳本不保存可能需要的主鍵腳本,如果該腳本在另一個表上運行不正確。換句話說,它可能是不安全的 –

相關問題