通过JDBC调用存储过程中的INSERT

时间:2011-11-24 17:21:55

标签: 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 #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,并且该过程正常运行,因此我认为它不是权限。

我希望我的解释和问题足够清楚。我很欣赏有关我做错的任何想法或建议。

1 个答案:

答案 0 :(得分:0)

没有必要检查#TempTableB是否存在,因为一旦程序完成执行就会自动删除它,就像其他临时表被自动删除一样;也许你希望这些表有后续调用proc的数据,这就是为什么你认为从Java调用它时它不起作用?

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