2011-06-17 165 views
9

请考虑以下sql从存储过程插入temp表,返回多个结果集

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

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

Create Table #temp1(
Column1 int, 
Column2 int) 

insert into #temp1 exec myProc 

我的问题是可以只插入第一个结果集到#temp1吗?

+0

http://stackoverflow.com/questions/209383/select-columns-from-result-set-of-stored-procedure – THEn

+0

[How to SELECT * INTO \ [temp table \] FROM \ [Stored Procedure \]]的可能重复(http://stackoverflow.com/questions/653714/how-to-select-into-temp-table-from -stored-procedure) –

回答

2

旧帖子,但我面临同样的问题,虽然上面提到的答案有点相关,但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."); 

.......

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

+1除了从'SqlDataReader'中提取元数据过于简单并且为'SqlDataRecord'创建'SqlMetaData'外,这会导致问题,这取决于返回的数据类型,这很漂亮很多从存储过程获取特定结果集的唯一方法。 –

1

还有另外一种方式

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

这会插入第一个结果集为# temp