sql >> データベース >  >> RDS >> Sqlserver

複数の結果セットを返すストアド プロシージャから一時テーブルに挿入する

    古い投稿ですが、同じ問題に直面しました。上記の回答は少し関連していますが、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();
    }
    


    1. mysql select query where date=...データを返さない

    2. 同期が外れたときにpostgresの主キーシーケンスをリセットするにはどうすればよいですか?

    3. WHERE句のさまざまな組み合わせのインデックス作成戦略。テキストパターン

    4. MySQLからストレスを取り除くためにPHPでキャッシュする