0

Я написал хранимую процедуру для сохранения и обновления данных (списка). Обновления хранимой процедуры (любые дополнительные данные) дублируют данные и любые новые данные добавляются в базу данных, то есть данные проверяются, присутствует ли данный файл в базе данных или нет.Не удалось добавить Время ожидания истекло. Период ожидания, прошедший до завершения операции, или сервер не отвечает

Процедура проста и работает хорошо, но проблема в том, я получаю вышеуказанную ошибку:

Unable to add Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding

Я не могу добавить данные, но через некоторое время ошибка решает и получает данные сохраняются и обновляются , В чем проблема? Нужно ли мне менять время выполнения запроса в сервере SQL Server или нужно оптимизировать запрос?

Моя процедура выглядит следующим образом:

ALTER PROCEDURE [dbo].[InsertManuallyUsingXmlExhibitorList] 
    @XML_TRANSACTIONDETAILS nText, 
    @exhibitor nvarchar(100) 
AS 
DECLARE @docHandle int 

SET NOCOUNT ON; 

DECLARE @exbitionID nvarchar(100) 

EXEC sp_xml_preparedocument @docHandle OUTPUT, @XML_TRANSACTIONDETAILS 


-- CREATE TEMP TABLE 

CREATE TABLE #TempTable 
(
    maxid nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    companyname nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    email nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    website nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    country bigint NULL, 
    contactperson nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    telphone nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    mobile nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    fax nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    region bigint NULL, 
    status bigint NULL, 
    username bigint NULL, 
    date datetime NULL, 
    category bigint NULL, 
    urlorcatalog nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    address nvarchar(200) Collate SQL_Latin1_General_CP1_CI_AS NULL, 
    lastupdatedby bigint NULL 
) 

-- INSERT INTO TEMP TABLE DETAILS OF EMAIL 

INSERT INTO #TempTable 
       (
        maxid,companyname,email,website,country,contactperson,telphone,mobile,fax,region,status,username,date,category,urlorcatalog,address,lastupdatedby 
       ) 

SELECT 
      data.maxid,data.companyname,data.email,data.website,data.country,data.contactperson,data.telphone,data.mobile,data.fax,data.region,data.status,data.username,GETDATE(),data.category,data.urlorcatalog,data.address,data.username 

    FROM OPENXML(@docHandle,N'master/TRANSACTION',3) 

       WITH 
       (
       companyname nvarchar(200), 
       website nvarchar(200), 
       country bigint , 
       contactperson nvarchar(200), 
       telphone nvarchar(200), 
       mobile nvarchar(200), 
       fax nvarchar(200), 
       region bigint, 
       status bigint, 
       username bigint,     
       category bigint, 
       urlorcatalog nvarchar(200), 
       email nvarchar(200),     
       maxid nvarchar(200), 
       address nvarchar(200)   
      ) as data 

-- INSERT INTO TEMP TABLE DETAILS OF EMAIL1 

INSERT INTO #TempTable 
       (
        maxid,companyname,email,website,country,contactperson,telphone,mobile,fax,region,status,username,date,category,urlorcatalog,address,lastupdatedby 
       ) 

SELECT 
      data.maxid,data.companyname,data.email1,data.website,data.country,data.contactperson,data.telphone,data.mobile,data.fax,data.region,data.status,data.username,GETDATE(),data.category,data.urlorcatalog,data.address,data.username 

    FROM OPENXML(@docHandle,N'master/TRANSACTION',3) 

       WITH 
       (
       companyname nvarchar(200), 
       website nvarchar(200), 
       country bigint , 
       contactperson nvarchar(200), 
       telphone nvarchar(200), 
       mobile nvarchar(200), 
       fax nvarchar(200), 
       region bigint, 
       status bigint, 
       username bigint,     
       category bigint, 
       urlorcatalog nvarchar(200), 
       email1 nvarchar(200),    
       maxid nvarchar(200), 
       dataentrytype nvarchar(200), 
       lastupdatedby nvarchar(200), 
       address nvarchar(200)   

      ) as data 
      WHERE data.email1 !='' 


-- INSERT INTO TEMP TABLE DETAILS OF EMAIL2 

INSERT INTO #TempTable 
       (
        maxid,companyname,email,website,country,contactperson,telphone,mobile,fax,region,status,username,date,category,urlorcatalog,address,lastupdatedby 
       ) 

SELECT 
      data.maxid,data.companyname,data.email2,data.website,data.country,data.contactperson,data.telphone,data.mobile,data.fax,data.region,data.status,data.username,GETDATE(),data.category,data.urlorcatalog,data.address,data.username 

    FROM OPENXML(@docHandle,N'master/TRANSACTION',3) 

       WITH 
       (
       companyname nvarchar(200), 
       website nvarchar(200), 
       country bigint , 
       contactperson nvarchar(200), 
       telphone nvarchar(200), 
       mobile nvarchar(200), 
       fax nvarchar(200), 
       region bigint, 
       status bigint, 
       username bigint, 
       category bigint, 
       urlorcatalog nvarchar(200), 
       email2 nvarchar(200), 
       maxid nvarchar(200),     
       address nvarchar(200) 

      ) as data 

      WHERE data.email2 !='' 


--**********************UPDATE TEMP TABLE IF COUNTRY AND REGION IS NULL******************** 

UPDATE #TempTable 
SET 
country=1 
WHERE country=0 

UPDATE #TempTable 
SET 
region=2 
WHERE region=0 

-- CODE TO COUNT DUPLICATES EMAILS 

SELECT 
COUNT 
(email) 

FROM 
    #TempTable T 

     WHERE 
       T.email !='' 
     AND 
     EXISTS (SELECT emailinfo.email FROM dbo.emailinfo WHERE email=T.email) 



-- TRANSACTION BEGINS HERE 


BEGIN TRANSACTION 

---------------------- EXHIBITOR LIST ------------------------------------ 

    IF EXISTS (SELECT * 
       FROM exibitions 
       WHERE [email protected]) 

     BEGIN 

     SELECT @exbitionID = EID FROM exibitions WHERE [email protected] 

     end 

    ELSE 

     BEGIN 

      INSERT INTO exibitions VALUES (@exhibitor) 

      SET @exbitionID = (SELECT SCOPE_IDENTITY()) 

     END 
------------- UPADATE EXHIBITOR LIST ------------------------------------- 

--DECLARE @RtnStr VARCHAR(MAX) 

UPDATE dbo.companyinfo 

SET companyinfo.exblist=RESULT.m2 

FROM 

( 
select TEMP1.DataID,COALESCE(COMPANY.exblist + ',', '') + @exbitionID as 'm2' 
from 

     ( 
      SELECT Email.DataID,ROW_NUMBER() OVER (PARTITION BY tmp.email ORDER BY tmp.email) AS 'RowNumber' 
      FROM #TempTable tmp 
      LEFT OUTER JOIN emailinfo Email ON tmp.email =Email.email   

      WHERE 
       tmp.email !=''   
      AND 
      EXISTS (SELECT emailinfo.email FROM dbo.emailinfo WHERE email=tmp.email) 
     )AS TEMP1 

    LEFT OUTER JOIN dbo.companyinfo COMPANY ON TEMP1.DataID =COMPANY.dataId  

    WHERE 

    TEMP1.RowNumber =1  


) AS RESULT 

WHERE companyinfo.dataId =RESULT.DataID 

IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -101 END 


------------- UPDATE DATE IF EMAIL ALREADY EXISTED ------------------------ 

UPDATE dbo.companyinfo 

SET companyinfo.lastupdateddate=RESULT.date 

FROM 

( 
select TEMP1.date,TEMP1.DataID 
from 

     ( 
      SELECT tmp.date,Email.DataID,ROW_NUMBER() OVER (PARTITION BY tmp.email ORDER BY tmp.email) AS 'RowNumber' 
      FROM #TempTable tmp 
      LEFT OUTER JOIN emailinfo Email ON tmp.email =Email.email   

      WHERE 
       tmp.email !=''   
      AND 
      EXISTS (SELECT emailinfo.email FROM dbo.emailinfo WHERE email=tmp.email) 
     )AS TEMP1 

    LEFT OUTER JOIN dbo.companyinfo COMPANY ON TEMP1.DataID =COMPANY.dataId  

    WHERE 

    TEMP1.RowNumber =1  


) AS RESULT 

WHERE companyinfo.dataId =RESULT.DataID 

IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -101 END 


-- ******************* UPDATE CATEGORY IF EMAIL ALREADY EXISTED *********************** 

UPDATE dbo.companyinfo 

SET companyinfo.category=case when companyinfo.status!=1 and companyinfo.status!=2 and companyinfo.status!=13 and companyinfo.status!=17 then RESULT.category else companyinfo.category end 

FROM 

( 
select TEMP1.category,TEMP1.status,TEMP1.DataID 
from 

     ( 
      SELECT tmp.category,tmp.status,Email.DataID,ROW_NUMBER() OVER (PARTITION BY tmp.email ORDER BY tmp.email) AS 'RowNumber' 
      FROM #TempTable tmp 
      LEFT OUTER JOIN emailinfo Email ON tmp.email =Email.email   

      WHERE 
       tmp.email !=''   
      AND 
      EXISTS (SELECT emailinfo.email FROM dbo.emailinfo WHERE email=tmp.email) 
     )AS TEMP1 

    LEFT OUTER JOIN dbo.companyinfo COMPANY ON TEMP1.DataID =COMPANY.dataId  

    WHERE 

    TEMP1.RowNumber =1  

) AS RESULT 

WHERE companyinfo.dataId =RESULT.DataID 

IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -101 END 


-- ******************* UPDATE COMPANY IF EMAIL ALREADY EXISTED *********************** 

UPDATE dbo.companyinfo SET companyinfo.companyname=case when companyinfo.companyname='' or companyinfo.companyname=null then RESULT.companyname else companyinfo.companyname end , 
companyinfo.website= case when companyinfo.website='' OR companyinfo.website IS NULL then RESULT.website else companyinfo.website end , 
companyinfo.contactperson= case when companyinfo.contactperson='' OR companyinfo.contactperson IS NULL then RESULT.contactperson else companyinfo.contactperson end,companyinfo.country = case when companyinfo.country=1 OR companyinfo.country IS NULL then RESULT.country else companyinfo.country end, 
companyinfo.telphone=case when companyinfo.telphone='' OR companyinfo.telphone IS NULL then RESULT.telphone else companyinfo.telphone end,companyinfo.mobile= case when companyinfo.mobile='' OR companyinfo.mobile IS NULL then RESULT.mobile else companyinfo.mobile end , 
companyinfo.fax= case when companyinfo.fax='' OR companyinfo.fax IS NULL then RESULT.fax else companyinfo.fax end, companyinfo.region= case when companyinfo.region=2 OR companyinfo.region IS NULL then RESULT.region else companyinfo.region end,companyinfo.address= case when companyinfo.address='' OR companyinfo.address IS NULL then RESULT.address else companyinfo.address end, 
companyinfo.lastupdatedby=RESULT.lastupdatedby 
FROM 

( 
select TEMP1.companyname,TEMP1.website,TEMP1.contactperson,TEMP1.country, TEMP1.telphone , TEMP1.mobile, TEMP1.fax,TEMP1.region, TEMP1.urlorcatalog,TEMP1.address,TEMP1.lastupdatedby, TEMP1.DataID 
from 

     ( 
      SELECT tmp.companyname,tmp.website,tmp.contactperson,tmp.country,tmp.telphone,tmp.mobile,tmp.fax, tmp.region,tmp.urlorcatalog,tmp.address,tmp.lastupdatedby,Email.DataID,ROW_NUMBER() OVER (PARTITION BY tmp.email ORDER BY tmp.email) AS 'RowNumber' 
      FROM #TempTable tmp 
      LEFT OUTER JOIN emailinfo Email ON tmp.email =Email.email             
      WHERE 
       tmp.email !=''   
      AND 
      EXISTS (SELECT emailinfo.email FROM dbo.emailinfo WHERE email=tmp.email) 
     )AS TEMP1 

    LEFT OUTER JOIN dbo.companyinfo COMPANY ON TEMP1.DataID =COMPANY.dataId  

    WHERE 

    TEMP1.RowNumber =1  

) AS RESULT 

WHERE companyinfo.dataId =RESULT.DataID 

IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -101 END 



-- ******************** UPDATE STATUS IF EMAIL ALREADY EXISTED ****************** 


UPDATE dbo.companyinfo 

SET companyinfo.status=RESULT.status 

FROM 

( 
select TEMP1.status,TEMP1.DataID 
from 

     ( 
      SELECT tmp.email,tmp.status,Email.DataID,ROW_NUMBER() OVER (PARTITION BY tmp.email ORDER BY tmp.email) AS 'RowNumber' 
      FROM #TempTable tmp 
      LEFT OUTER JOIN dbo.emailinfo Email ON tmp.email=Email.email    

      WHERE 
       tmp.email !=''   
      AND 
      EXISTS (SELECT emailinfo.email FROM dbo.emailinfo WHERE email=tmp.email) 
     )AS TEMP1 

    LEFT OUTER JOIN dbo.companyinfo COMPANY ON TEMP1.DataID=COMPANY.dataID 

    where --cmp.status !=8 And 
    TEMP1.RowNumber=1  AND 
    COMPANY.status !=1   AND 
    COMPANY.status < 6   AND 
    TEMP1.status < COMPANY.status 

) AS RESULT 

WHERE companyinfo.dataID=RESULT.DataID 

IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -101 END 



-- ************INSERT INTO PRIMARY TABLE(companyinfo)************* 


INSERT INTO dbo.companyinfo 
       (
        dataId,companyname,website,country,contactperson,telphone,mobile,fax,region,status,userid,date,category,urlorcatalog,dataentrytype,address,exblist 
      ) 


SELECT 
          T1.maxid,T1.companyname,T1.website,T1.country,T1.contactperson,T1.telphone,T1.mobile,T1.fax,T1.region,T1.status,T1.username,T1.date,T1.category,T1.urlorcatalog,'MANUAL',T1.address,@exbitionID     

         FROM 
         ( 
          SELECT tmpdata.*, ROW_NUMBER() OVER (PARTITION BY maxid ORDER BY maxid) AS 'RowNumber' 
          FROM 
          (

             SELECT 
               * 

             FROM 
             (
               SELECT tmp.*, ROW_NUMBER() OVER (PARTITION BY tmp.email ORDER BY tmp.email) AS 'RowNumber1' 
               FROM #TempTable tmp 
      --          LEFT OUTER JOIN emailinfo Email ON tmp.email=Email.email 
             )AS T 

             WHERE T.RowNumber1=1 
             AND T.email !='' 
             AND 
             NOT EXISTS (SELECT emailinfo.email FROM dbo.emailinfo WHERE email=T.email) 


          )tmpdata 


         )AS T1 

         WHERE 
        T1.email !='' AND 

        T1.RowNumber=1 

IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -101 END 


-- ************INSERT INTO SECONDARY TABLE************* 


INSERT INTO emailinfo 
     ( 
      DataID,email 
      ) 
SELECT 
     T.maxid,T.email 

FROM 
(
     SELECT tmp.maxid,tmp.email, ROW_NUMBER() OVER (PARTITION BY tmp.email ORDER BY tmp.email) AS 'RowNumber' 
     FROM #TempTable tmp 
      --LEFT OUTER JOIN emailinfo Email ON tmp.email=Email.email 
)AS T 

WHERE T.RowNumber=1 
AND T.email !='' 
AND 
NOT EXISTS (SELECT emailinfo.email FROM dbo.emailinfo WHERE email=T.email) 

IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -101 END 



COMMIT TRANSACTION 

DROP TABLE #TempTable 

EXEC sp_xml_removedocument @docHandle 

ошибка сохраняется даже для очень немногих записей около 4-5 обновлений/вставки.

+0

Не могли бы вы включать код для хранимой процедуры? – DanielV

ответ

0

При попытке изменить большую таблицу с помощью конструктора таблицы в Microsoft SQL Server Management Studio, вы можете получить сообщение об ошибке, похожее на следующее:

Unable to modify table. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

RESOLUTION:

чтобы решить эту проблему, используйте один из следующих способов:

  • Нажмите, чтобы очистить Override сотрудничества Значение тайм-аута строки nnection для Обновление дизайнера таблицы для конструктора таблиц и для конструктора баз данных в SQL Server Management Studio.
  • Укажите высокий параметр в поле «Тайм-аут транзакции после» для дизайнера таблицы и для конструктора баз данных в SQL Server Management Studio.
  • Измените большую таблицу с помощью операторов Transact-SQL в Query Редактор в SQL Server Management Studio.

Ссылки:

Time out

+0

Я попытался изменить тайм-аут транзакции после 30 секунд до 60 секунд, но проблема не решена. – user3300727

Смежные вопросы

 Смежные вопросы