使用输入主键表名称在存储过程中创建外键约束

时间:2016-01-26 14:42:31

标签: sql-server sql-server-2008 stored-procedures sql-server-2008-r2

我正在编写一个存储过程,用于创建一个名称作为输入提供的表。我通过使用临时名称_TMP

创建表来完成此操作
--Create the table with a temp name since the variable name
--cannot be used in the "CREATE TABLE" statement.
CREATE TABLE [dbo].[_TMP]
(
    [EntryID] [uniqueidentifier] NOT NULL,
    CONSTRAINT [PK__TMP] PRIMARY KEY CLUSTERED 
    (
        [EntryID] ASC
    )
    WITH 
    (
        PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
        IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
        ALLOW_PAGE_LOCKS  = ON
    )
)

然后将其重命名为:

EXEC SP_RENAME N'_TMP', @TargetTableName

现在我想添加另一个输入,它是现有主键表的名称,因此我可以在新表中设置外键关系。假设我还在我的新表中创建了名为ParentEntryID的FK列。

ALTER TABLE [dbo].[_TMP]  WITH CHECK 
ADD  CONSTRAINT [FK__TMP__TMP_PARENT] FOREIGN KEY([ParentEntryID])
REFERENCES [dbo].[_TMP_PARENT] ([EntryID]) -- <-- this won't work b/c there's no such table _TMP_PARENT

ALTER TABLE [dbo].[_TMP] CHECK CONSTRAINT [FK__TMP__TMP_PARENT]

如上面评论中所述,问题是该过程将失败,因为我无法使用REFERENCES子句提供实际的主键表名称。 是否有一个系统sp可以处理变量表名来设置外键关系?我找不到一个。

1 个答案:

答案 0 :(得分:3)

首先,如果您需要创建具有新名称和相同结构的表,则会出现设计问题。这不是一个好的技术,是一个数据库反模式。

但是,如果您坚持使用它,则需要使用动态sql创建表和索引。请在线查找如何在图书中执行此操作并首先阅读本文:

http://www.sommarskog.se/dynamic_sql.html