2011-06-17 24 views
9

次のSQLを検討してください複数の結果セットを返すストアドプロシージャから挿入する

2つの結果セットを返すmyProcという名前のストアドプロシージャ。結果セット1は、column1、column2を返します。結果セット2は、カラム3、カラム4、カラム5を返します。

テンポラリテーブルは2つのintカラムしか定義していないので、次のsqlは失敗します。

Create Table #temp1(
Column1 int, 
Column2 int) 

insert into #temp1 exec myProc 

私の質問は、#temp1に最初の結果セットを挿入するだけですか?

+0

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

+0

[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に分割することを除いて、SQL CLRプロシージャを記述してSPを実行し、必要な結果セットのみを返すことでした。このプロシージャは、必要な結果セットのインデックスを取得し、T-SQL SPを実行するためにSqlCommandを実行し、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)') 

別の方法があります。これは、#に最初の結果セットを挿入します温度

関連する問題