存储过程结果集中的SQL Server表定义

时间:2010-03-19 14:13:52

标签: sql sql-server tsql

是否有人知道从存储过程结果集创建表定义的方法?

我有一个存储过程,它产生一个包含30多列的结果集,我想把它放到一个表中,而不必手动创建所有的表列。

是否有内置过程会转储列名和类型..?

感谢。

5 个答案:

答案 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)