Microsoft JDBC ドライバー (4.0.2206) を使用する代わりに jTDS ドライバー (1.3) に切り替えると、奇妙な問題が発生しました。
サンプル コードの DDL は次のとおりです。
CREATE TABLE [dbo].[Test] (
[Id] int IDENTITY(1,1) NOT NULL,
[Value] varchar(10) NOT NULL
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED([Id])
) ON [PRIMARY]
INSERT INTO Test([Value]) VALUES('1')
INSERT INTO Test([Value]) VALUES('2')
プロファイラーを開いた状態でコードを実行した後、MS ドライバーが実行されていることがわかりました (これは機能します)。
declare @p1 int
set @p1=null
exec sp_prepexec @p1 OUTPUT, NULL, N'SELECT *
INTO #tmpTable
FROM Test
SELECT * FROM #tmpTable
DROP TABLE #tmpTable'
また、jTDS の問題 (「無効なオブジェクト名 '#tmpTable'」が表示されます (Java では例外はスローされません)):
declare @p1 int
set @p1=null
exec sp_prepare @p1 OUTPUT, NULL, N'SELECT *
INTO #tmpTable
FROM Test
SELECT * FROM #tmpTable
DROP TABLE #tmpTable'
exec sp_execute @p1
ドキュメントによると sp_prepexec は以前の手順が組み合わされているのに、sp_prepare と sp_execute が sp_prepexec と異なるのはなぜですか?
sp_prepare を実行しているときに、2 番目のクエリで #tmpTable が見つからないのはなぜですか?