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

12
考虑以下SQL语句:
有一个名为myProc的存储过程,返回两个结果集。结果集1包含column1和column2。结果集2包含column3、column4和column5。
下面的SQL语句将失败,因为临时表只定义了2个int列。
Create Table #temp1(
Column1 int,
Column2 int)

insert into #temp1 exec myProc

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


https://dev59.com/OHVC5IYBdhLWcg3wsTfv - THEn
可能是重复的问题:如何从存储过程中选择* INTO [temp table] - Factor Mystic
2个回答

3
有另一种方法。
SELECT * into #temp 
  from OPENROWSET('SQLNCLI', 'Server=(local)\\(instance);Trusted_Connection=yes;',
'EXEC (database).(schema).(sproc)')

这将把第一个结果集插入到 #temp 中。

3

虽然上面提到的答案有点相关,但我也遇到了同样的问题。原帖的问题是关于返回多个集的存储过程的。除了重写存储过程以将其拆分为更小的存储过程之外,我找到的唯一解决方案是编写一个 SQL CLR 过程来执行存储过程并仅返回所需的结果集。该过程获取所需结果集的索引,执行 SqlCommand 来运行初始的 T-SQL 存储过程,然后循环遍历 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.");

.......

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();
}

除了从SqlDataReader中提取元数据并为SqlDataRecord创建SqlMetaData可能会根据返回的数据类型而导致问题的过度简化外,这几乎是从存储过程获取特定结果集的唯一方法。 - Solomon Rutzky

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