INSERT в хранимой процедуре, вызываемой через JDBC

У меня установлен 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, поэтому я подумал, что это может быть проблема с разрешениями. Я вхожу в MSSQL Studio, используя аутентификацию SQL, которая не связана с учетной записью Windows, и процедура работает как обычно, поэтому я не думаю, что это разрешения.

Надеюсь, мое объяснение и вопрос достаточно ясны. Буду признателен за любые мысли или предложения относительно того, что я делаю неправильно.


person androider    schedule 24.11.2011    source источник
comment
Это не помогает решить проблему, но вы можете сделать TRUNCATE TABLE dbo.PreviousTableA, а не delete from dbo.PreviousTableA where scheduleID > -1, предполагая, что нет записей, где scheduleID ‹= -1.   -  person ig0774    schedule 24.11.2011
comment
Ах, отлично, это было в моем списке дел. Спасибо.   -  person androider    schedule 24.11.2011
comment
Я прибег к созданию реальной таблицы в базе данных, в которой есть копия данных, я назвал ее на основе метки времени в хранимой процедуре. Когда я вызываю свою процедуру из JDBC, данные из таблицы возвращаются, но когда я иду и смотрю в SSMS, таблица не существует. Я создаю его через SELECT * INTO [tableName_timestamp] из currentTableA   -  person androider    schedule 25.11.2011


Ответы (1)


Нет необходимости проверять, существует ли #TempTableB, поскольку он будет автоматически удален после завершения процедуры, так же как и другие временные таблицы автоматически удаляются; возможно, вы ожидаете, что в этих таблицах будут данные о последующих вызовах процедуры, и поэтому вы думаете, что она не работает, когда вы вызываете ее из Java?

Когда вы выполняете эти операторы SQL из SSMS, они могут содержать данные, поскольку это все тот же сеанс базы данных, но это не тот случай, когда вызывается с использованием JDBC.

person Icarus    schedule 24.11.2011
comment
Спасибо за предложение. Единственная таблица, в которой, как я ожидаю, будут данные, - это предыдущая таблица, которая должна быть заполнена из временной таблицы внутри процедуры. Я понимаю, что временные таблицы не сохраняются. Дроп был сделан, чтобы упростить тестирование с помощью ssms. Не уверен, что происходит :( - person androider; 24.11.2011