2

Excelファイルを一時テーブルに読み込み、そのテーブルのデータの一部をマッサージし、そのテーブルから選択した行を永続テーブルに挿入するストアドプロシージャを作成しようとしています.

したがって、次のように始まります。

SET @SQL = "select * into #mytemptable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database="+@file+";HDR=YES', 'SELECT * FROM [Sheet1$]')"

EXEC (@SQL)

それくらい効きそうです。

ただし、次のようなことを試してみると:

Select * from #mytemptable

エラーが発生します:

無効なオブジェクト名 '#mytemptable'

#mytemptable が認識されないのはなぜですか? 残りのストアド プロシージャから #mytemptable にアクセスできるようにする方法はありますか?

よろしくお願いします!

4

3 に答える 3

5

これをモックアップする時間がないので、うまくいくかどうかはわかりませんが、テーブルを「#mytemptable」ではなく「##mytemptable」と呼んでみてください。

あなたの問題は、SQL文字列をexec()した後、テーブルがスコープ内にないことだと思います。2ポンドの記号が前に付いた一時テーブルには、グローバルにアクセスできます。

使い終わったら、忘れずにドロップしてください。

于 2009-05-14T14:53:43.493 に答える
2

私が過去にこれを行った方法は次のとおりです。まず、CREATE TABLE を使用して #temp_table を作成します。2 番目に、#temp_table に挿入する通常どおり動的クエリを作成します。3 番目に、exec sp_executesql @sql を使用します。

この方法では、グローバル スコープの ##temp_table は必要ありません。

于 2010-04-29T00:42:15.083 に答える
2

動的クエリのスクリプト全体を含む同じスコープで使用できます。

DECLARE @strSQL nvarchar(max)
DECLARE @file varchar(100)

SET @file='c:\myfile.xls'
SET @strSQL=N'SELECT * INTO #mytemptable FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;Database='+@file+';HDR=YES'', ''SELECT * FROM [Sheet1$]'');'
SET @strSQL=@strSQL+N'SELECT * FROM #mytemptable'

EXECUTE sp_executesql @strSQL
于 2010-06-22T15:32:41.367 に答える