請考慮以下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嗎?
請考慮以下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嗎?
舊帖子,但我面臨同樣的問題,雖然上面提到的答案有點相關,但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();
}
+1除了從'SqlDataReader'中提取元數據過於簡單並且爲'SqlDataRecord'創建'SqlMetaData'外,這會導致問題,這取決於返回的數據類型,這很漂亮很多從存儲過程獲取特定結果集的唯一方法。 –
還有另外一種方式
SELECT * into #temp
from OPENROWSET('SQLNCLI', 'Server=(local)\\(instance);Trusted_Connection=yes;',
'EXEC (database).(schema).(sproc)')
這會插入第一個結果集爲# temp
http://stackoverflow.com/questions/209383/select-columns-from-result-set-of-stored-procedure – THEn
[How to SELECT * INTO \ [temp table \] FROM \ [Stored Procedure \]]的可能重複(http://stackoverflow.com/questions/653714/how-to-select-into-temp-table-from -stored-procedure) –