Ошибка пакетного обновления SQL - новый запрос не может быть запущен, поскольку он должен содержать допустимый дескриптор транзакции - PullRequest
0 голосов
/ 01 декабря 2011

Я использую Microsoft SQL Server 2008 и драйвер jdbc 3.0 и получаю эту ошибку при пакетном обновлении SQL

"Новый запрос не может быть запущен, так как он должен идти с допустимым дескриптором транзакции"

Для отладки я уменьшил размер пакета до одного оператора, но он все еще содержит ошибки.Вот оно

IF EXISTS (SELECT * FROM StaffDetail WHERE PsnID = 'GC91') 
    UPDATE staffdetail 
    SET    psnid = 'GC91', 
           servicegroup = '41B001', 
           discipline = 'IT', 
           dob = '1967-09-28', 
           ghdstartdate = '2008-12-15', 
           yearsexperience = '11 to 20 years', 
           classification = 'Admin Officer 1' 
    WHERE  psnid = 'GC91' 
ELSE 
    INSERT INTO staffdetail 
                (psnid, 
                 servicegroup, 
                 discipline, 
                 dob, 
                 ghdstartdate, 
                 yearsexperience, 
                 classification) 
    VALUES      ('GC91', 
                 '41B001', 
                 'IT', 
                 '1967-09-28', 
                 '2008-12-15', 
                 '11 to 20 years', 
                 'Admin Officer 1') 

Почему это ошибка?Я гуглил это и нашел только ссылки на ошибку в SQL 2005, а не 2008.

Можно ли как-нибудь изменить строку подключения, которую я использую для подключения, или изменить операторы SQL, которые я использую в пакете, чтобы попробоватьи избежать этой ошибки?

Ответы [ 4 ]

0 голосов
/ 16 августа 2016

Позднее обновление, если другие находят мои выводы полезными ...

У меня недавно была эта проблема. Повторная обработка запроса на использование либо CTE, либо табличных переменных часто решала его, но в конечном итоге, как отмечается в http://computer -aaaargh.blogspot.co.za / 2012/12 / weird-reason-of- msg-3989-new-request-is.html , это связано с базовыми данными. Посмотрите на свои объединения и попробуйте изменить то, что вы извлекаете из базовых данных - в этом случае только один оператор (попробуйте SELECT 1 FROM StaffDetail WHERE PsnID = 'GC91') или используйте другой сценарий в существовании только в качестве формы ликвидация.

0 голосов
/ 01 декабря 2011

Вместо этого вы можете MERGE , который удаляет IF и ELSE, что делает его действительно одним утверждением

MERGE INTO staffdetail AS TARGET 
USING (VALUES ('GC91', 
      '41B001', 
      'IT', 
      '1967-09-28', 
      '2008-12-15', 
      '11 to 20 years', 
      'Admin Officer 1')) AS SOURCE (psnid, servicegroup, discipline, dob, 
      ghdstartdate, yearsexperience, classification) 
ON TARGET.psnid = SOURCE.psnid 
WHEN MATCHED THEN 
  UPDATE SET servicegroup = SOURCE.servicegroup, 
             discipline = SOURCE.discipline, 
             dob = SOURCE.dob, 
             ghdstartdate = SOURCE.ghdstartdate, 
             yearsexperience = SOURCE.yearsexperience, 
             classification = SOURCE.classification 
WHEN NOT MATCHED BY TARGET THEN 
  INSERT (psnid, 
          servicegroup, 
          discipline, 
          dob, 
          ghdstartdate, 
          yearsexperience, 
          classification) 
  VALUES ('GC91', 
          '41B001', 
          'IT', 
          '1967-09-28', 
          '2008-12-15', 
          '11 to 20 years', 
          'Admin Officer 1') 
0 голосов
/ 01 декабря 2011

Вы можете поместить приведенный выше код в качестве определения хранимой процедуры и пройти через con.prepareStatement?

0 голосов
/ 01 декабря 2011

Попробуйте изменить свой SQL на это:

UPDATE StaffDetail SET PsnID = 'GC91',ServiceGroup = '41B001',Discipline = 'IT',DOB = '1967-09-28',GHDStartDate = '2008-12-15',YearsExperience = '11 to 20 years',Classification = 'Admin Officer 1' WHERE PsnID = 'GC91';

INSERT INTO StaffDetail (PsnID,ServiceGroup,Discipline,DOB,GHDStartDate,YearsExperience,Classification) 
SELECT 'GC91','41B001','IT','1967-09-28','2008-12-15','11 to 20 years','Admin Officer 1'
WHERE NOT EXISTS (SELECT * FROM StaffDetail WHERE PsnID = 'GC91') 
...