T-SQL如何创建结构在另一个表中的表?

Edw*_*vin 3 sql t-sql sql-server

我该如何使用t-sql和SQL Server创建一个存储过程来创建一个表,该表的结构存储在另一个表中?

Ale*_*xei 5

T-SQL允许使用以下SELECT * ... INTO语法动态创建表:

SELECT * INTO TargetTable
FROM SourceTable
-- any false returning condition will do
WHERE 1 = 0
Run Code Online (Sandbox Code Playgroud)

这也可以写得很优雅(感谢Deadsheep39):

SELECT TOP 0 * INTO TargetTable
FROM SourceTable
Run Code Online (Sandbox Code Playgroud)

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

IF OBJECT_ID('TheSchema.TargetTable') IS NOT NULL
    DROP TABLE TargetTable
Run Code Online (Sandbox Code Playgroud)

另外,将不会创建索引,约束或触发器。请点击这里了解更多详情。

如果要动态化(表名是参数),可以创建并执行动态查询:

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
Run Code Online (Sandbox Code Playgroud)