Sql server 在具有输入主键表名的存储过程中创建外键约束

Sql server 在具有输入主键表名的存储过程中创建外键约束,sql-server,sql-server-2008,stored-procedures,sql-server-2008-r2,Sql Server,Sql Server 2008,Stored Procedures,Sql Server 2008 R2,我正在编写一个存储过程来创建一个表,该表的名称作为输入提供。我通过使用临时名称\u 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, CONSTRAIN

我正在编写一个存储过程来创建一个表,该表的名称作为输入提供。我通过使用临时名称
\u 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
现在,我想添加另一个输入,即现有主键表的名称,以便在新表中设置外键关系。假设我还在名为
parentryid
的新表中创建了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]
用CHECK更改表[dbo].[u TMP]
添加约束[FK\U TMP\U TMP\U父项]外键([ParentryId])

引用[dbo].[u TMP\u PARENT]([EntryID])--首先,如果需要创建具有新名称和相同结构的表,则会出现设计问题。这不是一种好技术,是一种数据库反模式

但是,如果您仍在使用它,则需要使用动态sql创建表和索引。请在联机丛书中查找如何做到这一点,并首先阅读本文:


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

但是,如果您仍在使用它,则需要使用动态sql创建表和索引。请在联机丛书中查找如何做到这一点,并首先阅读本文:


这不是对您实际问题的回答(抱歉),但是您可以创建表,然后使用EXEC(字符串)命令创建FK吗?另外-您可以使用新表的名称作为约束,也可以重命名它们。。。否则您只能执行此操作一次;-)@bri——谢谢,是的,为了简洁起见,我省略了对约束的重命名。我希望在不使用动态sql的情况下实现这一点。您需要的是一种边缘情况,而动态sql几乎是实现这一点的唯一方法。使用
sp_executeSQL
通常比
EXECUTE
更安全。这不是对您实际问题的回答(抱歉),但是您可以创建表,然后使用EXEC(字符串)命令创建FK吗?另外-您可以使用新表的名称作为约束,也可以重命名它们。。。否则您只能执行此操作一次;-)@bri——谢谢,是的,为了简洁起见,我省略了对约束的重命名。我希望在不使用动态sql的情况下实现这一点。您需要的是一种边缘情况,而动态sql几乎是实现这一点的唯一方法。使用
sp\u executeSQL
通常比
EXECUTE
更安全。谢谢您的回答。我很想知道为什么这不是一个好的技术和反模式。如果我解释一下我在做什么,也许会有所帮助:这些表是为存储在别处发生的某些数据更改而创建的日志表。它们是以相同的结构作为起点创建的,因为所有这样的表都应该有一组已知的元字段。特定的日志数据列稍后由另一个进程添加。一些日志表共享父/子关系——这就是我的问题。如果你能告诉我另一种方法,我会很高兴……或者更多地阅读有关此反模式的内容(它的具体名称是什么,以便我可以查找它?),谢谢你的回答。我很想知道为什么这不是一个好的技术和反模式。如果我解释一下我在做什么,也许会有所帮助:这些表是为存储在别处发生的某些数据更改而创建的日志表。它们是以相同的结构作为起点创建的,因为所有这样的表都应该有一组已知的元字段。特定的日志数据列稍后由另一个进程添加。一些日志表共享父/子关系——这就是我的问题。如果你能告诉我另一种方法,我会很高兴……或者更多地阅读有关此反模式的内容(它的具体名称是什么,以便我可以查找它?)