1

C#コードからストアドプロシージャを呼び出すと、なぜ一時テーブルを作成できないのかを調査するために、丸一日と何時間も費やしました。

C#コードの一部を想定しましょう:

public void GetDataByFilter(string item, string filter ...) {
   ... 
   // provide stored procedure in new SqlCommand object
   sqlCommand.CommandType = CommandType.StoredProcedure;

   sqlCommand.Parameters.Add("@val1", aValue1);
   sqlCommand.Parameters.Add("@val2", aValue2);
   ...
   while(sqlDataReader.Read()) { /* process info here */ }
}

と私のストアドプロシージャ

ALTER PROCEDURE [dbo].[aProcedure]
  @val1 VARCHAR(255),
  @val2 VARCHAR(255),
  ...
AS 
BEGIN
  IF OBJECT_ID(N'tempdb..##aTempTable') IS NULL
    CREATE TABLE tempdb..##aTempTable (
          id1 INT,
              id2 INT,
              id3 VARCHAR(255),
              ...
    )

ELSE 
    TRUNCATE TABLE tempdb..##aTempTable

    -- insert information into this table
    SELECT @paramList = ' /*list of parameters*/';

    EXEC sp_executesql @sql, @paramList, ... parameters
END

C#コードでは、別の関数で、私は提供しました

sqlCommand.CommandText = "SELECT * FROM tempdb..##aTempTable";

tempdb..##aTemTableしかし、存在しない例外がスローされました。

SSMS(Sql Server Management Studio)内でストアドプロシージャを実行すると、テーブルが作成されます。

問題は、だけでなくTRUNCATE TABLE操作にもあります。CREATE TABLE

それに応じて異なるストアドプロシージャで使用するための一時グローバルテーブルが必要です。ストアドプロシージャによって作成された一時テーブルを別のストアドプロシージャで使用することは可能ですか?

解決策はありますか?

4

2 に答える 2

1

あなたが説明していることを行うことは可能ですが、それは多くのトリッキーなタイミングを想定しているため、あまり実用的ではないと思います。セッションは接続Aを開き、procを実行して##tempテーブルを作成します。接続B、Cなどが一時テーブルにアクセスできる必要がある限り、接続を開いたままにします。

「永続的な」テーブルを使用するソリューションを使用すると、「セッション」ごとに一意の識別子(intまたはGUID)で行が追加され、その値が初期化呼び出しによって返されます(または、取得または取得できます)。識別された)、およびセッションの後続のすべての呼び出しで使用されます。

于 2012-09-13T14:02:53.650 に答える
0

以前の回答でほのめかしたように(ただし、その時点でシナリオを説明していなかったため、詳しく説明しませんでした)、1つのスコープで作成された一時テーブルは、ネストされたスコープからアクセスできます。

したがって、C#では、次のクエリを実行できます。

CREATE TABLE #aTempTable (
      id1 INT,
          id2 INT,
          id3 VARCHAR(255),
          ...
);

それから:

[dbo].[aProcedure]

それから:

[dbo].[bProcedure]

それから:

SELECT * from #aTempTable

これらのクエリがすべて同じSqlConnectionオブジェクトを使用して実行され、接続がずっと開いたままになっている場合。1番目と4番目のクエリは、接続のスコープ内で実行されるだけです。2つのストアドプロシージャ呼び出しは、ネストされたスコープ内で実行されます。

グローバル一時テーブルは必要ありません。aProcedure簡単にアクセスできます#aTempTable(参照の前にどこを付ける必要もありませんtempdb..

于 2012-09-13T13:58:12.720 に答える