Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Виснет BCP при организации транзакции(MS SQL Server 2000)  [new]
maldalik
Member

Откуда:
Сообщений: 63
Возникла проблема такого рода, есть процедура которая сохраняет в файл талицу, она работает через xp_cmdshell вызывает bcp. Но как только я пытаюсь организовать транзакцию, работать перестает - виснет на экспорте первого файла
создает его пустым и на этом все причем Timeout тоже не отрабатывает.
Вот код
Alter proc [dbo].[mda_Send_Sms]
     @Phonenum Varchar(30)
    ,@text Varchar(100)
	,@ContrNum Varchar(30)
as
begin
Set nocount on
Declare @Stroka varchar(255),
		@filename Varchar(100),
		@run varchar(1500),
		@run1 varchar(1500),
		@tmp as varchar(7),
		@date datetime
Set @date=getdate()

Set @tmp=cast(cast(right(@ContrNum,7) as int)as varchar)
Set @filename=@tmp+'_'+convert(char(8),getdate(),112)+cast(datepart(hour,getdate())as varchar)+cast(datepart(minute,getdate())as varchar)+cast(datepart(second,getdate())as varchar)
-----------------jobs----------------------------
SET LOCK_TIMEOUT 6000
Begin Tran
Insert into mda_sms_log
Values(@date,@Phonenum,@ContrNum,@text)
If @@Error<>0
  begin
	rollback 
	exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось записать лог'	 
  end	

delete from mda_sms_  
If @@Error<>0
  begin
	rollback 
	exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось очистить таблицу'	 
  end	

set @stroka=@Phonenum+';M;R;'+@text
Insert into mda_sms_  
values(@stroka)
If @@Error<>0
  begin
	rollback 
	exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось добавить сообщение в таблицу отправки'	 
  end	

		select @run = 'bcp "Select SMSText from Bill.dbo.mda_sms_" queryout "c:\sms\from nts\'+@filename+'.txt" -SServer -Usa -Pxxxx -C RAW -c'
		select @run1 = 'bcp "Select SMSText from Bill.dbo.mda_sms_" queryout "c:\simplesms\tmp\'+@filename+'.txt" -SServer -Usa -Pxxxx -C RAW -c'

		execute master..xp_cmdshell @run, NO_OUTPUT
		If @@Error<>0
		  begin
			rollback 
			exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось отправить сообщение'	 
		  end
		execute master..xp_cmdshell @run1, NO_OUTPUT
		If @@Error<>0
		  begin
			rollback 
			exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось отправить сообщение'	 
		  end
commit
end

А вот такой вариант работает, но без транзакции не хотелось бы.
USE [bill]
GO
/****** Object:  StoredProcedure [dbo].[Send_Sms]    Script Date: 04/16/2013 10:04:33 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO


Alter proc [dbo].[mda_Send_Sms]
     @Phonenum Varchar(30)
    ,@text Varchar(100)
	,@ContrNum Varchar(30)
as
begin
Set nocount on
Declare @Stroka varchar(255),
		@filename Varchar(100),
		@run varchar(1500),
		@run1 varchar(1500),
		@tmp as varchar(7),
		@date datetime
Set @date=getdate()

Set @tmp=cast(cast(right(@ContrNum,7) as int)as varchar)
Set @filename=@tmp+'_'+convert(char(8),getdate(),112)+cast(datepart(hour,getdate())as varchar)+cast(datepart(minute,getdate())as varchar)+cast(datepart(second,getdate())as varchar)
-----------------jobs----------------------------
SET LOCK_TIMEOUT 6000
--Begin Tran
Insert into mda_sms_log
Values(@date,@Phonenum,@ContrNum,@text)
If @@Error<>0
  begin
--	rollback 
	exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось записать лог'	 
  end	

delete from mda_sms_  
If @@Error<>0
  begin
--	rollback 
	exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось очистить таблицу'	 
  end	

set @stroka=@Phonenum+';M;R;'+@text
Insert into mda_sms_  
values(@stroka)
If @@Error<>0
  begin
--	rollback 
	exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось добавить сообщение в таблицу отправки'	 
  end	

		select @run = 'bcp "Select SMSText from Bill.dbo.mda_sms_" queryout "c:\sms\from nts\'+@filename+'.txt" -SServer -Usa -Pxxxx -C RAW -c'
		select @run1 = 'bcp "Select SMSText from Bill.dbo.mda_sms_" queryout "c:\simplesms\tmp\'+@filename+'.txt" -SServer -Usa -Pxxxx -C RAW -c'

		execute master..xp_cmdshell @run, NO_OUTPUT
		If @@Error<>0
		  begin
--			rollback 
			exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось отправить сообщение'	 
		  end
		execute master..xp_cmdshell @run1, NO_OUTPUT
		If @@Error<>0
		  begin
--			rollback 
			exec abort @ErrNo=42999,@ResourceName='Ошибка:не удалось отправить сообщение'	 
		  end
--commit
end

Получается нельзя использовать транзакцию для внешних операций?

Сообщение было отредактировано: 16 апр 13, 22:18
16 апр 13, 08:13    [14184952]     Ответить | Цитировать Сообщить модератору
 Re: Виснет BCP при организации транзакции(MS SQL Server 2000)  [new]
maldalik
Member

Откуда:
Сообщений: 63
maldalik,

Как мне редактировать мой пост?
16 апр 13, 08:18    [14184958]     Ответить | Цитировать Сообщить модератору
 Re: Виснет BCP при организации транзакции(MS SQL Server 2000)  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
maldalik
maldalik,

Как мне редактировать мой пост?
Никак.
16 апр 13, 08:53    [14185056]     Ответить | Цитировать Сообщить модератору
 Re: Виснет BCP при организации транзакции(MS SQL Server 2000)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вы в одном коннекте меняете таблицу mda_sms_log и ждете, что в другом коннекте сможете прочитать эти изменения до завершения транзакции ???
16 апр 13, 09:23    [14185216]     Ответить | Цитировать Сообщить модератору
 Re: Виснет BCP при организации транзакции(MS SQL Server 2000)  [new]
maldalik
Member

Откуда:
Сообщений: 63
Glory,

Намек понял, спасибо.
16 апр 13, 09:28    [14185237]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить