我正在编写一个存储过程,用于创建一个名称作为输入提供的表。我通过使用临时名称_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可以处理变量表名来设置外键关系?我找不到一个。
答案 0 :(得分:3)
首先,如果您需要创建具有新名称和相同结构的表,则会出现设计问题。这不是一个好的技术,是一个数据库反模式。
但是,如果您坚持使用它,则需要使用动态sql创建表和索引。请在线查找如何在图书中执行此操作并首先阅读本文: