Sql server 在通过JDBC调用的存储过程中插入

Sql server 在通过JDBC调用的存储过程中插入,sql-server,stored-procedures,jdbc,ssms,temp-tables,Sql Server,Stored Procedures,Jdbc,Ssms,Temp Tables,我已经安装了MSSQL Server 2008 Express。 在我的数据库中,我有一组表和一个存储过程 我想要实现的是获取对现有表所做的任何更改,并在过程结束时返回这些更改。我创建的存储过程在MSSQL Management Studio中本地运行时运行良好 但是,当我通过JDBC连接调用该过程时,该过程的某些部分似乎尚未完成 我想做的事情总结如下: 1) Put a snapshot of the data contained in CurrentTableA into #CurrentS

我已经安装了MSSQL Server 2008 Express。 在我的数据库中,我有一组表和一个存储过程

我想要实现的是获取对现有表所做的任何更改,并在过程结束时返回这些更改。我创建的存储过程在MSSQL Management Studio中本地运行时运行良好

但是,当我通过JDBC连接调用该过程时,该过程的某些部分似乎尚未完成

我想做的事情总结如下:

1) Put a snapshot of the data contained in CurrentTableA into #CurrentShotA (temporary table)

2) Compare #CurrentShotA with PreviousTableA 

3) Insert differences into #TempTableB 
(this equates to new rows or altered rows in #CurrentShotA)

4) Empty PreviousTableA

5) Insert contents of #CurrentShotA into PreviousTableA

6) Select * from #TempTableB (return all new rows and changes)
步骤6在第一次通过JDBC调用数据时正确返回数据。 在第二次和后续时间调用该过程时,很明显步骤5未按预期完成。当PreviousTableA应该包含旧数据的快照时,它总是空的

问题是,为什么在MSSQL Management studio中调用时,该过程可以正常工作,而在我通过JDBC调用时却不能正常工作

CREATE PROCEDURE [dbo].[getUpdatedSchedules] 
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Check of the temporary table exists, delete if it does
        IF OBJECT_ID('#TempTableB','U')IS NOT NULL
        begin
            drop table #TempTableB
        end

        -- Force the creation of the temporary tables quickly
        select * into #TempTableB from dbo.CurrentTableA where 1=0
        select * into #CurrentShotA from dbo.CurrentTableA where 1=0

        -- Get the differences between schedules and put into #TempTableB
        insert #CurrentShotA select * from dbo.CurrentTableA
        insert #TempTableB select * from #CurrentShotA 
        except select * from dbo.PreviousTableA

        TRUNCATE TABLE dbo.PreviousTableA       
        insert dbo.PreviousTableA select * from #CurrentShotA
        select * from #TempTableB
    END
GO
我对存储过程和MSSQL配置还很熟悉,所以我认为这可能是一个权限问题。我使用未链接到windows帐户的SQL身份验证登录MSSQL Studio,并且该过程正常运行,因此我认为这不符合权限要求


我希望我的解释和问题足够清楚。如果您对我的错误有任何想法或建议,我将不胜感激。

无需检查诱惑B是否存在,因为它将在过程完成后自动删除,就像其他临时表自动删除一样;也许您希望这些表具有后续调用proc的数据,这就是为什么您认为从Java调用它时它不起作用的原因


当您从SSM执行这些SQL语句时,它们可能包含数据,因为它们都是相同的数据库会话,但使用JDBC调用时并非如此。

无助于解决此问题,但您可能希望截断表dbo.PreviousTableA,而不是从dbo.PreviousTableA中删除,其中scheduleID>-1,假设没有scheduleID的记录啊,太好了,那是我的待办事项列表。谢谢。我已经在数据库中创建了一个实际的表,该表包含数据的副本,我根据存储过程中的时间戳来命名它。当我从JDBC调用我的过程时,表中的数据被返回,但当我在SSMS中查找时,表并不存在。我通过从currentTableAThanks的[tableName\u timestamp]中选择*来创建该建议。我唯一希望有数据的表是previoustableA,它应该从过程中的temp表填充。我知道临时表不会持久存在。下降是为了使SSM测试更容易。不确定发生了什么: