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

3

我该如何使用T-SQL和SQL Server创建存储过程来创建一张表,其结构存储在另一张表中?


另一个表中存储了什么?结构类似于information_schema.columns还是您想要复制表结构?要复制结构,请使用select top 0 * into newtable from... - Deadsheep39
要填充新表的列,就是要使用的列! - Aleb
2个回答

5

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

然而,如果目标表已经存在,这将会失败,因此您应该检查它是否存在:

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

此外,不会创建索引、约束或触发器。有关更多详细信息,请单击此处
如果您想动态地使用(表名是参数),可以创建并执行动态查询:
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

可以使用系统函数 object_id 来简化检查对象是否存在的操作 - if object_id('dbname.schema.tablename') is not null drop table dbname.schema.tablename 如果你在默认架构下的数据库中,也可以这样写: if object_id('tablename') is not null drop table tablename 或者在 tempdb 示例中如下所示:if object_id('tempdb..#tablename') is not null drop table tempdb..#tablename - Deadsheep39
@Deadsheep39 - 我已经按照你的建议简化了对象存在性检查。谢谢。 - Alexei - check Codidact

2

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

例如:

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

您可以根据需要构建的表格类型,在@query变量中进行构建。


基本上,您可以用比必要的复杂方式执行创建表语句,并且需要手动定义输入吗? 这不是对问题的好回答,-1。 - Tobb
据我所理解,问题是如何动态创建表,其结构存储在另一个表中。 - Vasyl Zvarydchuk
是的,您可以使用SELECT INTO,但问题是没有指定什么样的新表结构。只有在评论中稍后提到“是的,列,用于填充新表的列”。 - Vasyl Zvarydchuk
让我们在聊天中继续这个讨论 - Vasyl Zvarydchuk
不论什么(只是加一个字母或其他东西),SO 不允许我改变投票,除非有编辑.. 我可以自己编辑,算了。 - Tobb
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接