2017-11-07 18 views
1

1つのクエリの結果を使用してグローバルな一時テーブルを作成しようとしていますが、テーブルとして選択して何度も何度もデータを再処理しなくてもさらに操作できます。Excel - SQLクエリ - ## Tempテーブル

これはSQL管理スタジオでは完全に機能しますが、Excelクエリでテーブルを追加しようとすると、テーブルはその時点で参照できますが、tempdbデータベースのテンポラリテーブルには作成されません。

私はそれを簡単な例に分解しました。

私はSQL管理スタジオでこれを実行する場合は、1の結果が期待通りに返され、テーブル## testtable1は、一時表に

set nocount on; 

select 1 as 'Val1', 2 as 'Val2' into ##testtable1 
select Val1 from ##testtable1 

を作成している私は、このテーブルの上に別の選択を実行することができ、別のセッションでも、あなたが期待していたとおりです。例えば。

Select Val2 from ##testtable1 

## testtable1を削除しないと、Excelのクエリで以下を実行すると2の結果が返されます。私は、直接Excelで## testtable1クエリSELECT ... INTO同じことを実行する場合

Select Val2 from ##testtable1 

しかし、それは正しく1の結果を返しますが、TEMPTABLEは作成されません。私はその後、別のクエリとして

Select Val2 from ##testtable1 

を実行しようとすると、そのエラーは、テーブルがSQL管理スタジオで一時テーブル内にリストされていない「無効なオブジェクト名 『## testtable1』

言っ

クエリの実行が終了した後、私はドロップを呼び出していない午前にもかかわらず、それは、テーブルの上にドロップを実行しているかのように。

それはある。

方法私はこれを解決できますか?

+1

なぜグローバルな一時テーブルが最初に必要ですか?それらは並行性の問題があります。グローバルテーブルを使用している最後の接続が閉じられると、グローバルテーブルが削除されることに注意してください。つまり、Excelで作成しても、それを使用しない場合は、一時表が無期限にハングアップするだけではありません。 –

+0

@SeanLangeがすでに言及したことを強調するだけです.SSMSは、Excelができない間にセッションを開いたままにします。クエリを送信するたびに、新しいセッションが作成され、すぐに再び閉じられます(クエリが完了すると)。 – Ralph

+0

これは最終的に、親会社に属する5つのブランドの財務バランスシートレポートを作成することです。各ブランドは別々のデータベースです。 結果を返す5つのクエリがあります。それらの結果をまとめて「グループ合計」として追加する必要があります。 1つのクエリですべてを実行できない理由はありませんが、5つのクエリのそれぞれが22,000文字であるため、それらをすべて一緒に追加すると.ConnectionString文字の制限を超えてしまいます。 この方法では、Management Studioで完全に機能しますが、Excelを介してそのデータ処理を実行しようとしているだけです。 – OWSam

答えて

2

は、グローバルな一時テーブル上に読んでD:C)

も同様に、あなたはあなたの人生を容易にするために...サーバ側への複雑さの多くを動かす基本的には何もストアドプロシージャを使用してVBAからそれを呼び出すことができます(GTT)。それを参照するセッションが存在する限り、それらは永続します。 SSMSでは、別のセッションで使用する前にGTTを作成したセッションを閉じると、GTTは破棄されます。これはExcelで起こっていることです。 Excelは接続を作成し、実行し、切断します。Excelの切断時にGTTを使用するセッションがないため、GTTは破棄されます。

GTTを使用するのではなく、通常のテーブルを作成することを強くお勧めします。一時的な性質とアクティブなセッションへの依存性のために、GTTを使用すると一貫性のない結果が生じることがあります。代わりに通常の表を作成する場合は、後で使用するときにはそれが存在するかどうかを確かめることができます。

テーブルを作成/消去するコードは非常に簡単です。

IF OBJECT_ID('db.schema.tablename') IS NOT NULL 
    TRUNCATE TABLE [tablename] 
ELSE 
    CREATE [tablename]... 
GO 

切り捨てを削除に変更すると、特定のデータセットをクリーンアップして、それぞれのクエリの先頭に置くことができます。

+0

提案ありがとうございました:) 通常のテーブルを使用するだけで、私はそれが正確に機能しています。 私はそれを使用し終えるとすぐにテーブルのドロップを呼び出します。 – OWSam

0

ビューを使用することは可能でしょうか?

CREATE VIEW [dbo].[testView] 
    AS 
    SELECT  * 
    FROM   database1.dbo.myTable 
    UNION 
    SELECT  * 
    FROM   database2.dbo.myTable 

し、Excelで:

データ>新しいクエリ>データベース> FromSQL Serverデータベース

から、あなたがビューで一緒にデータ組合することができます、同じサーバー上の5つのDBに接続していると仮定

は、DBサーバ

を入力し、適切なDBからビューを選択します - 例えばVBAら(ただし、あなたがそれをやっている:)

を行わまたはビューを呼び出します。

関連する問題