gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:21:48 26 4
gpt4 key购买 nike

考虑下面的sql

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

由于临时表仅定义了 2 个 int 列,因此以下 sql 将失败。

Create Table #temp1(
Column1 int,
Column2 int)

insert into #temp1 exec myProc

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

最佳答案

旧帖子,但我遇到了同样的问题,虽然上面提到的答案有点相关,但 OP 的问题是关于返回多个集合的 SP。除了重写 SP 以将其拆分为更小的 SP 之外,我能找到的唯一解决方案是编写 SQL CLR执行 SP 并仅返回所需结果集的过程。该过程获取所需结果集的索引,执行 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.");

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

关于sql - 从返回多个结果集的存储过程插入临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6388489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com