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

Откуда:
Сообщений: 19
Всех с наступающим новым годом!
Написал процедуру результатом которой является xml. На MSDN прочитал статью про BCP и пытаюсь с ее помощью сохранить результат выполнения в файл. В процедуре используется временная таблица, при вызове процедуры через Менджмент студио все ровно, а вот при использование BCP ошибка:

Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid object name '#repo_start'.


Есть идеи как это вылечить, кроме замены временной таблицы на переменную с типом таблицы?
27 дек 16, 13:17    [20052545]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

Откуда:
Сообщений: 19
Может есть какой-нибудь другой способ сохранить результат выполнения процедуры в файл?
27 дек 16, 13:19    [20052553]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
hks-msk
Есть идеи как это вылечить, кроме замены временной таблицы на переменную с типом таблицы?
Что за процедура, как вызывается из BCP?
27 дек 16, 14:12    [20052860]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

Откуда:
Сообщений: 19
У меня проблема с любой процедурой которая использует временную таблицу, например:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE _Temp
AS
BEGIN

	SET NOCOUNT ON;

declare
@title varchar(200),
@txt_data_in varchar(10),
@txt_data_out varchar(10)

create table #t (code varchar(32), name varchar(32))
INSERT INTO #t (code,name) VALUES ('ВНБР','Внебиржевой Фондовый Рынок')
INSERT INTO #t (code,name) VALUES ('ФРМБ','Фондовый Рынок Московской биржи ')


SET @title = 'Отчет Брокера за '
Select @title as "@title",
@title as "@title2",
@title as "@title3",
@title as "@title4",
(Select	code as "@code",name as "@name" from #t as "@id"
for xml path('item'),type) as "spot_trade_operations",
(Select	'test1' as "@id",
                      'test2' as "@ids",
                      'test3' as "@idf"
for xml path('item'),type) as "non_trade_money_operations"
for xml path('broker_report')
DROP TABLE #t

END
GO


Вызываю:

Declare @OutputFileName varchar(max)
,@cmd varchar(8000)
,@result int
,@OutputFileNameInstrument varchar(max)


Set @OutputFileName = 'D:\Soft\Broker_Report\Broker_Report.xml'

Set @cmd = 'BCP "EXEC [FVT_QORT_DB].[dbo].[_Temp]" queryout "'+ @OutputFileName + '" -w -C1251 -r -T -S MCC-SRV0009'
EXEC @result = master..xp_cmdshell @cmd
print @cmd
27 дек 16, 14:25    [20052911]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
hks-msk
У меня проблема с любой процедурой которая использует временную таблицу, например:
Да, есть такое...
Непонятно, почему МС это не считает багом.
27 дек 16, 15:01    [20053048]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
hks-msk,

https://technet.microsoft.com/en-us/library/ms191503(v=sql.105).aspx
27 дек 16, 15:10    [20053083]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

Откуда:
Сообщений: 19
Не понял, нужно задать временную таблицу с процедуре с двумя диесами? Так просто?
27 дек 16, 15:15    [20053111]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
hks-msk
Не понял, нужно задать временную таблицу с процедуре с двумя диесами? Так просто?

глобальные временные таблицы... блин... прочитайте сначала про них
27 дек 16, 15:20    [20053137]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alexeyvg
hks-msk
У меня проблема с любой процедурой которая использует временную таблицу, например:
Да, есть такое...
Непонятно, почему МС это не считает багом.

вообще пишут что bcp открывает новый коннект, по этому так и живёт
27 дек 16, 15:21    [20053141]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
alexeyvg
hks-msk
У меня проблема с любой процедурой которая использует временную таблицу, например:
Да, есть такое...
Непонятно, почему МС это не считает багом.


а причем тут баг, bcp другой клиент, соответственно открывает свой коннект к серверу, все в рамках БОЛ
27 дек 16, 15:30    [20053175]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

Откуда:
Сообщений: 19
Не два ## не помогло (

Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid object name '##repo_start'.

Когда пробую без bcp просто вызвать xp_cmdshell с параметром -E тоже в ошибку сваливается ( :

[SQL Server Native Client 10.0]Named Pipes Provider: Could not open a connection to SQL Server [53].
[SQL Server Native Client 10.0]Login timeout expired
[SQL Server Native Client 10.0]A network-related or instance-specific
error has occurred while establishing a connection to SQL Server.
Server is not found or not accessible. Check if instance name is
correct and if SQL Server is configured to allow remote connections.

Пробовал так:

DECLARE @result int
EXEC @result = master..xp_cmdshell 'osql -C1251 -r -T -S ''MCC-SRV0009'' -E -Q "EXEC [FVT_DB].[dbo].[_Broker_Report_xml] @acc_client_code = ''FF_11'', @date_in = 20161126, @Period = 30"-b -o D:\Soft\Broker_Report\Broker_Report.xml'
27 дек 16, 15:40    [20053216]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
у него же временная таблица _внутри_ процедуры создается, которую bcp запускает. оно структуру рекордсета определить не может.

обмануть можно как-то так в вашем случае:
CREATE PROCEDURE _Temp
AS
BEGIN

if 1 = 0 begin
  select * from sys.objects for xml auto;
end;


ну, или, действительно, не пользоваться временными таблицами.
27 дек 16, 15:42    [20053227]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

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

Обманка не сработала или сработала но как то не так ( Ошибка:
Error = [Microsoft][SQL Server Native Client 10.0]Function sequence error
27 дек 16, 15:52    [20053289]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
hks-msk
daw,

Обманка не сработала или сработала но как то не так ( Ошибка:
Error = [Microsoft][SQL Server Native Client 10.0]Function sequence error


так работает, вроде:

alter procedure dbo.test
as

if 1 = 0 begin
  select * from sys.objects for xml auto;
  set fmtonly off;
  return;
end;

create table #t(c int);
insert into #t values (777);

select * from #t for xml auto;


go
27 дек 16, 15:59    [20053322]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
hks-msk,

не знаю что вы делаете, но вот так работает

-- 
CREATE PROCEDURE dbo.PrcResultSet
AS

CREATE TABLE #Temp 
(
	Name VARCHAR(255)
)

INSERT INTO #Temp(Name) SELECT Name FROM sys.objects

SELECT TOP 10 Name FROM #Temp

DROP TABLE #Temp
GO



Declare @OutputFileName varchar(max)
,@cmd varchar(8000)
,@result int
,@OutputFileNameInstrument varchar(max)


Set @OutputFileName = 'H:\Report.txt'

Set @cmd = 'BCP "EXEC [TestDb].[dbo].[PrcResultSet]" queryout "'+ @OutputFileName + '" -w -C1251 -r -T -S SERVBERNAME'
EXEC @result = master..xp_cmdshell @cmd
print @cmd

 
27 дек 16, 16:00    [20053331]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

Откуда:
Сообщений: 19
daw, Большое спасибо!

Вот без этих двух строк(красным) не работало, но сними все прокатило!

if 1 = 0 begin
select * from sys.objects for xml auto;
set fmtonly off;
return;

end;

Мой опыт совсем не большой, прошу у всех прощения.
27 дек 16, 16:19    [20053429]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
TaPaK
hks-msk,

не знаю что вы делаете, но вот так работает



а это у вас версия bcp более поздняя, использующая уже NativeClient 11.0. в нем по-другому стали структуру рекордсета определять, с помощью sp_describe_first_result_set. в более старые времена вызывался код с set fmtonly on.
27 дек 16, 16:27    [20053463]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
hks-msk,

Достаточно было
Set @cmd = 'BCP "set fmtonly off; EXEC [FVT_QORT_DB].[dbo].[_Temp]" queryout "'+ @OutputFileName + '" -w -C1251 -r -T -S MCC-SRV0009'
27 дек 16, 16:30    [20053474]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

Откуда:
Сообщений: 19
TaPaK,
К сожалению опыта не хватает воспользоваться таким решением, так как ваш пример сильно отличается от моего (
27 дек 16, 16:32    [20053484]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

Откуда:
Сообщений: 19
invm,
Может сиквел может руки, но при вызове
Set @cmd = 'BCP "set fmtonly off; EXEC [FVT_DB].[dbo].[_Temp]" queryout "'+ @OutputFileName + '" -w -C1251 -r -T -S MCC-SRV0009'

Ошибка:
Error = [Microsoft][SQL Server Native Client 10.0]BCP host-files must contain at least one column
27 дек 16, 16:40    [20053524]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
hks-msk
Member

Откуда:
Сообщений: 19
daw,
Может в качестве бонуса подскажите как двумя первыми строчками в мой xml добавить:

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="https://my-broker.ru/report/broker_report.xsl"?>
27 дек 16, 16:55    [20053598]     Ответить | Цитировать Сообщить модератору
 Re: Результат процедуры в файл BCP  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
hks-msk
daw,
Может в качестве бонуса подскажите как двумя первыми строчками в мой xml добавить:

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="https://my-broker.ru/report/broker_report.xsl"?>


как-то так:
declare @xml varchar(max);

set @xml = '<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="https://my-broker.ru/report/broker_report.xsl"?>
' + (select * from #t for xml auto);

select @xml
27 дек 16, 17:07    [20053647]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить