1


1

procからn個のテーブルの1番目を一時テーブルに挿入することは可能ですか?

これに対する答えは出ていないと思いますが、健全性チェックを使用できます。

3つのテーブルを返すprocがあります。 Table1は23列あります。 Table2は12列あります。 Table3には2つの列があります。 このprocを実行してTable1の結果を一時テーブルにダンプする必要があります。 私は@tableを作成してからこれをしました:

insert @myTable
exec [myDb].dbo.[multitableProc] 'A', 'B', 'C', 100

しかし、私がこれをするとき、エラーは以下の通りです:

_ 挿入エラー:列名または指定された値の数がテーブル定義と一致しません。 _

それで、SQLは私がやりたいことについてかなり混乱していると思います。 テーブルの列数が正しいことを確認した上で、ダブルチェックしました。 データ型は正しいです。

結論として、これは不可能だと確信していますが、ここにいる誰かがトリックを持っているかもしれません。 ソースプロシージャの変更は許可されていません。 私は似たような質問を見ましたが、彼は同じではない、いくつかの共用体型のものをやろうとしていました。

1 回答


2


私が考えることができる唯一の方法はhttp://msdn.microsoft.com/en-us/library/ms131094.aspx [CLRストアドプロシージャ]を使用することです。 CLR sprocに3つのテーブルを返すsprocを呼び出させる。 次に、必要な単一のテーブルのみを取得して、それをCLR sprocから返します。 CLR sprocの結果を@myTableに挿入します。 これにより、他の2つの結果セットからのカラムの不一致を解消するために必要な追加レベルの間接参照が提供されると思います。

さて、私はテストするために非常に単純化されたバージョンを作成しました。 テーブルから2つの結果セットを返しました。1つは1つの列、もう1つは2つの列です。

DECLARE @myTable TABLE ( col1 varchar(50) )

INSERT @myTable( col1 )
EXEC TestTable

正しい結果を取得します…​

_ メッセージ213、レベル16、状態7、プロシージャTestTable、行23列名または指定された値の数がテーブル定義と一致しません。 _

私のTestTable TSQL sprocから最初の結果セット(1列のみのもの)を取り、そのテーブルだけを返すこのCLR sprocを作成しました。

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void FilterResult()
    {
        using (var conn = new SqlConnection("context connection = true"))
        {
            var retVal = new SqlDataRecord( new SqlMetaData("col1",
                                            SqlDbType.NVarChar, 50));
            conn.Open();

            var cmd = new SqlCommand("exec TestTable", conn);

            SqlContext.Pipe.SendResultsStart(retVal);

            using (var dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    var tmpCol = dr.GetString(0);
                    retVal.SetString(0, tmpCol);

                    SqlContext.Pipe.SendResultsRow(retVal);
                }

                dr.Close();
            }

            SqlContext.Pipe.SendResultsEnd();
        }
    }
};

その後、実行することができます…​

INSERT @myTable( col1 )
EXEC TestFilter  -- note the CLR sproc here instead of the TSQL sproc
  1. そしてすべてが幸せです…​

_ (影響を受けた2行) _

一日の終わりには、それは価値がある以上に問題になるかもしれませんが、それは概念実証として機能します。 (性能についての保証はありません)