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
更安全。谢谢您的回答。我很想知道为什么这不是一个好的技术和反模式。如果我解释一下我在做什么,也许会有所帮助:这些表是为存储在别处发生的某些数据更改而创建的日志表。它们是以相同的结构作为起点创建的,因为所有这样的表都应该有一组已知的元字段。特定的日志数据列稍后由另一个进程添加。一些日志表共享父/子关系——这就是我的问题。如果你能告诉我另一种方法,我会很高兴……或者更多地阅读有关此反模式的内容(它的具体名称是什么,以便我可以查找它?),谢谢你的回答。我很想知道为什么这不是一个好的技术和反模式。如果我解释一下我在做什么,也许会有所帮助:这些表是为存储在别处发生的某些数据更改而创建的日志表。它们是以相同的结构作为起点创建的,因为所有这样的表都应该有一组已知的元字段。特定的日志数据列稍后由另一个进程添加。一些日志表共享父/子关系——这就是我的问题。如果你能告诉我另一种方法,我会很高兴……或者更多地阅读有关此反模式的内容(它的具体名称是什么,以便我可以查找它?)