Sql 从返回多个结果集的存储过程插入临时表

Sql 从返回多个结果集的存储过程插入临时表,sql,sql-server-2005,tsql,stored-procedures,Sql,Sql Server 2005,Tsql,Stored Procedures,考虑以下sql 一个名为myProc的存储过程,返回两个结果集。结果集1返回第1列、第2列。结果集2返回第3列、第4列和第5列 以下sql将失败,因为临时表只定义了2个int列 Create Table #temp1( Column1 int, Column2 int) insert into #temp1 exec myProc 我的问题是,是否可以将第一个结果集插入到#temp1?旧帖子中,但我面临同样的问题,尽管上面提到的答案有点相关,OP的问题是关于返回多个集的SP。除了重写SP以将

考虑以下sql

一个名为myProc的存储过程,返回两个结果集。结果集1返回第1列、第2列。结果集2返回第3列、第4列和第5列

以下sql将失败,因为临时表只定义了2个int列

Create Table #temp1(
Column1 int,
Column2 int)

insert into #temp1 exec myProc

我的问题是,是否可以将第一个结果集插入到#temp1?

旧帖子中,但我面临同样的问题,尽管上面提到的答案有点相关,OP的问题是关于返回多个集的SP。除了重写SP以将其拆分为更小的SP之外,我能找到的唯一解决方案是编写一个执行SP并仅返回所需结果集的
SQL CLR
过程。该过程获取所需结果集的索引,执行
SqlCommand
以运行初始
T-SQL
SP,然后通过
SqlDataReader
结果循环,直到找到所需的结果集并返回相应的记录。以下代码是
SQL CLR
过程的一部分:

SqlDataReader rdr = command.ExecuteReader();
int index = 0;
bool bContinue = true;
while (index < resultSetIndex.Value)
{
    if (!rdr.NextResult())
    {
        bContinue = false;
        break;
    }
    index++;
}
if (!bContinue)
    throw new Exception("Unable to read result sets.");
SqlDataReader rdr=command.ExecuteReader();
int指数=0;
bool bContinue=true;
while(索引<结果索引值)
{
如果(!rdr.NextResult())
{
b继续=假;
打破
}
索引++;
}
如果(!b继续)
抛出新异常(“无法读取结果集”);

List<SqlMetaData> metadataList = new List<SqlMetaData>();
for (int i = 0; i < rdr.FieldCount; i++)
{
    string dbTypeName = rdr.GetDataTypeName(i);
    SqlMetaData metadata;
    if (dbTypeName.ToLower().Contains("char"))
        metadata = new SqlMetaData(rdr.GetName(i), (SqlDbType)Enum.Parse(typeof(SqlDbType), dbTypeName, true), 50);
    else
        metadata = new SqlMetaData(rdr.GetName(i), (SqlDbType)Enum.Parse(typeof(SqlDbType), dbTypeName, true));
    metadataList.Add(metadata);
}
SqlDataRecord record = new SqlDataRecord(metadataList.ToArray());
object[] values = new object[rdr.FieldCount];
if (rdr.HasRows)
{
    SqlContext.Pipe.SendResultsStart(record);
    while (rdr.Read())
    {
        rdr.GetValues(values);
        record.SetValues(values);
        SqlContext.Pipe.SendResultsRow(record);
    }
    SqlContext.Pipe.SendResultsEnd();
}
List metadataList=newlist();
对于(int i=0;i
还有另一种方法

SELECT * into #temp 
  from OPENROWSET('SQLNCLI', 'Server=(local)\\(instance);Trusted_Connection=yes;',
'EXEC (database).(schema).(sproc)')

这将把第一个结果集插入到+1的#temp

可能的副本中,除了从
SqlDataReader
提取元数据和为
SqlDataRecord
创建
SqlMetaData
过于简单之外,这可能会导致问题,具体取决于返回的数据类型,这几乎是从存储过程中获取特定结果集的唯一方法。