我已经设置了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,并且该过程正常运行,因此我认为它不是权限。
我希望我的解释和问题足够清楚。我很欣赏有关我做错的任何想法或建议。
答案 0 :(得分:0)
没有必要检查#TempTableB是否存在,因为一旦程序完成执行就会自动删除它,就像其他临时表被自动删除一样;也许你希望这些表有后续调用proc的数据,这就是为什么你认为从Java调用它时它不起作用?
当您从SSMS执行这些SQL语句时,它们可能包含数据,因为它们都是相同的数据库会话,但使用JDBC调用时并非如此。