【发布时间】:2016-01-26 14:42:31
【问题描述】:
我正在编写一个存储过程,它创建一个名称作为输入提供的表。我通过使用临时名称 _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 可以处理用于设置外键关系的变量表名?我还没有找到。
【问题讨论】:
-
不是您实际问题的答案(抱歉),但您可以创建表然后使用 EXEC(string) 命令创建 FK 吗?另外-您要么想将新表的名称用于约束,要么也重命名它们……否则您将只能执行一次;-)
-
@bri -- 谢谢,是的,为了简洁起见,我省略了约束的重命名。我希望在没有动态 sql 的情况下做到这一点。
-
您想要的只是一个边缘案例,而动态 SQL 几乎是实现此目的的唯一方法。使用
sp_executeSQL通常比EXECUTE更安全。
标签: sql-server sql-server-2008 stored-procedures sql-server-2008-r2