在切换到 jTDS 驱动程序 (1.3) 而不是使用 Microsoft JDBC 驱动程序 (4.0.2206) 时,我遇到了一个奇怪的问题。
以下是示例代码的 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_prepare 和 sp_execute 与 sp_prepexec 不同,根据文档 sp_prepexec 是前一个程序的组合?
为什么做sp_prepare时第二个查询找不到#tmpTable?