是否有人知道从存储过程结果集创建表定义的方法?
我有一个存储过程,它产生一个包含30多列的结果集,我想把它放到一个表中,而不必手动创建所有的表列。
是否有内置过程会转储列名和类型..?
感谢。
答案 0 :(得分:1)
您尝试过吗?
DECLARE @sql NVARCHAR(MAX) = N'EXEC mydb.dbo.my_procedure;';
SELECT name, system_type_name, max_length, is_nullable
FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 1);
它不会为您建立表,但是您可以在知道列名的名称和类型的情况下快速创建表。
答案 1 :(得分:0)
如果这是一次性的话,你可以试试这个(不是在制作中!)。
我通常只是转到子过程,并在返回结果集的查询中,在列选择列表和INTO YourNewTable
之间添加FROM
。运行子程序1次,然后删除更改。
然后,您可以通过查看SQl Server Management Studio中的YourNewTable
或任何表元数据查询来查看结果集列,如:
SELECT
*
FROM INFORMATION_SCHEMA.Columns
WHERE TABLE_NAME='YourNewTable'
ORDER BY ORDINAL_POSITION
答案 2 :(得分:0)
你“可以”做到,但我不知道我是否会推荐它:
EXEC sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
SELECT
*
INTO
#table
FROM
OPENROWSET(
'SQLNCLI',
'SERVER=.;Trusted_Connection=yes',
'EXEC StoredProcedureName'
)
答案 3 :(得分:0)
在存储过程中,您需要使用“WHERE 1 = 0”执行“SELECT INTO”,这样它才会创建一个空表。
如果要定义数据类型: 将列转换或转换为该数据类型
如果你想要一个NOT NULL约束,那么你必须在select中使用: isnull(yourcolumn,'123')作为你的列,然后在where子句中将WHERE yourcolumn<> '123'
答案 4 :(得分:0)
exec sp_describe_first_result_set N'mydb.dbo.my_sproc_name'