INSERT в хранимой процедуре, вызываемой через JDBC - PullRequest
0 голосов
/ 24 ноября 2011

У меня настроен 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, и процедура выполняется как обычно, поэтому я не думаю, что это разрешения.

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

1 Ответ

0 голосов
/ 24 ноября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...