T-SQL如何创建结构在另一个表中的表?
我如何创建一个存储过程来创建一个表,该表的结构存储在另一个表中,当然是使用t-sql和sql server?您可以使用create table语句将查询构造为字符串,并使用sp_executesql存储过程来执行它 例如:T-SQL如何创建结构在另一个表中的表?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我如何创建一个存储过程来创建一个表,该表的结构存储在另一个表中,当然是使用t-sql和sql server?您可以使用create table语句将查询构造为字符串,并使用sp_executesql存储过程来执行它 例如: DECLARE @query nvarchar(max) = N'CREATE TABLE Table(Col nvarchar(50) NULL)' EXECUTE sp_executesql @query 在@query变量中,您可以根据所需的表类型构建表。T-SQL允
DECLARE @query nvarchar(max) = N'CREATE TABLE Table(Col nvarchar(50) NULL)'
EXECUTE sp_executesql @query
在@query变量中,您可以根据所需的表类型构建表。T-SQL允许使用SELECT*…动态创建表。。。转换为语法: 由于Deadsheep39,这也可以写得很优雅: 但是,如果TargetTable已经存在,则此操作将失败,因此您应该检查它是否存在:
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
另一个表中存储了什么?结构类似于信息\u schema.columns还是要复制表结构?要复制结构,请使用select top 0*将其复制到新表中…是的,列,将用于填充新表的列!检查是否可以使用系统函数object_id简化存在-如果object_id'dbname.schema.tablename'不为空,则删除表dbname.schema.tablename,或者如果只有object_id'tablename'不为空,才使用默认模式在数据库中删除表tablename,如果object_id'tempdb..tablename'不为空,则删除tempdb上的示例删除表tempdb..tablename.@Deadsheep39-我已经按照您的建议简化了对象存在性检查。谢谢。所以基本上你可以用一种比必要的更困难的方式来执行CREATETABLE语句,输入必须手动定义?这不是对OP的一个很好的回答,-1.据我所知,问题是如何动态创建一个表,它的结构存储在另一个表中。是的,您可以使用SELECT INTO,但在问题中没有指定什么样的新表结构。只是后来在一个评论栏中,是的,列将被用来填充新表我看到接受的答案并不一定回答我所理解的问题,但你的答案除了CREATE TABLE的语法之外,实际上并没有包含太多内容。根据评论,OP希望根据另一个表的结构创建一个表,因此您的答案没有提供太多。但是从答案的日期来看,我发现这并不完全是坏事。。如果你对你的答案做一些小的修改,我会删除我的反对票,现在不行。。
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