2017-01-14 13 views
2

如何创建一个存储过程来创建一个表,其结构存储在另一个表中,当然还有t-sql和sql server?T-SQL如何创建其结构位于另一个表中的表?

+0

什么是存储在另一个表?结构像information_schema.columns或者你想重复表结构?要复制结构,使用'select top 0 * into newtable from ...'。 – Deadsheep39

+0

耶列,将要用来填补新表的柱子! – Ayoubleb

回答

3

T-SQL允许创建使用SELECT * ... INTO语法的飞行表:

SELECT * INTO TargetTable 
FROM SourceTable 
-- any false returning condition will do 
WHERE 1 = 0 

这也可以文笔优美(感谢Deadsheep39):

SELECT TOP 0 * INTO TargetTable 
FROM SourceTable 

然而,这将失败TargetTable已经存在,因此您应该检查其是否存在:

IF OBJECT_ID('TheSchema.TargetTable') IS NOT NULL 
    DROP TABLE TargetTable 

另外,不会创建索引,约束或触发器。检查here了解更多详情。

如果你想要去的动态(表名是参数),您可以创建并执行动态查询:

CREATE PROCEDURE dbo.GenerateTable 
(
    @SourceTable VARCHAR(128), 
    @TargetTable VARCHAR(128) 
)  
AS 
BEGIN 
    DECLARE @SQL NVARCHAR(4000) = N' 
     SELECT * INTO ' + QUOTENAME(@TargetTable) + ' 
     FROM ' + QUOTENAME(@SourceTable) + ' 
     -- any false returning condition will do 
     WHERE 1 = 0' 
    EXEC (@SQL) 
END 
GO 
+0

检查是否存在可以通过系统函数简化** object_id ** - '如果object_id('dbname.schema.tablename')不为null drop table dbname.schema.tablename'或者如果您只使用默认模式如果object_id('tempdb ..#tablename')不是null drop table tempdb ..#tablename',则表示object_id('tablename')不为null drop table tablename'或tempdb上的示例。 – Deadsheep39

+0

@ Deadsheep39 - 我按照你的建议简化了对象存在检查。谢谢。 – Alexei

2

您可以使用CREATE TABLE语句将查询构造为字符串,并使用sp_executesql存储过程执行它。

例如以这种方式:

DECLARE @query nvarchar(max) = N'CREATE TABLE Table(Col nvarchar(50) NULL)' 
EXECUTE sp_executesql @query 

凡在@query变量,你可以建立一个基于你需要什么样的表。

+0

因此,基本上,您可以用比所需的更困难的方式执行create table语句,输入必须手动定义?对于OP来说不是一个好的答案,-1。 – Tobb

+0

据我了解,问题是如何动态创建一个表,它的结构存储在另一个表中。 –

+0

是的,您可以使用SELECT INTO,但在问题中没有指定什么样的新表结构。只有在后面的评论“耶列,将用于填补新表”columbums“ –

相关问题