Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 получить код ошибки xp_cmdshell  [new]
нуб987
Guest
подскажите, как получить "настоящий" код ошибки после выполнения xp_cmdshell?
например, делаю так:
declare
   @cl nvarchar(1000) -- command line
   , @res int -- result

set @cl = 'dir "c:\123.txt"'
exec @res = master..xp_cmdshell @cl, no_output -- проверяем, есть ли файл


возвратит либо 0, либо 1
а как получить код выполнения самого dir, а не процедуры?
1 дек 16, 05:45    [19953709]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
Запустить без no_output
1 дек 16, 05:54    [19953714]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8316
Нубы ж справки не читают, не по-мужски это.
1 дек 16, 11:33    [19954388]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
нуб987
Guest
3unknown
Запустить без no_output

ну и вернет запрос вот это:
автор
Volume in drive C has no label.
Volume Serial Number is 8020-6E3D
NULL
Directory of c:\
NULL
File Not Found
NULL

парсить?

речь-то шла, как код ошибки получить
2 дек 16, 22:57    [19961915]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
Сделайте так:

declare
   @cl nvarchar(1000) -- command line
   , @res int -- result
   ,@ErrorMessage varchar(2000)

   if object_id('tempdb..#err') is not null drop table #err
   create table #err (txt varchar(5000))

set @cl = 'dir "c:\123.txt"'

insert #err
exec @res = master..xp_cmdshell @cl

IF @res <> 0
BEGIN
    SELECT @ErrorMessage = COALESCE(@ErrorMessage + ', ', '') + txt  
   FROM #err
    WHERE txt IS NOT NULL
 
    --Display error message and return code
    SELECT @ErrorMessage as ErrorMessage  ,@res as ReturnCode
 
END
3 дек 16, 01:55    [19962304]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
Владислав Колосов
Member

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

эта процедура не предназначена для прикладного применения, инструмент администратора. Используют в экстренных случаях.
Для задач импорта-экспорта существует Integratin Services.
5 дек 16, 12:28    [19967604]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
нуб987
Guest
3unknown
Сделайте так:
+

declare
   @cl nvarchar(1000) -- command line
   , @res int -- result
   ,@ErrorMessage varchar(2000)

   if object_id('tempdb..#err') is not null drop table #err
   create table #err (txt varchar(5000))

set @cl = 'dir "c:\123.txt"'

insert #err
exec @res = master..xp_cmdshell @cl

IF @res <> 0
BEGIN
    SELECT @ErrorMessage = COALESCE(@ErrorMessage + ', ', '') + txt  
   FROM #err
    WHERE txt IS NOT NULL
 
    --Display error message and return code
    SELECT @ErrorMessage as ErrorMessage  ,@res as ReturnCode
 
END

спасибо за пример. Но это опять не то. Нужен именно код ошибки, а не содержимое командной строки.
5 дек 16, 16:30    [19968956]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
нуб987
Guest
Владислав Колосов
нуб987,

эта процедура не предназначена для прикладного применения, инструмент администратора. Используют в экстренных случаях.
Для задач импорта-экспорта существует Integratin Services.

забыл добавить, что это для sql2000
там нет Integration Services
есть DTS'ы - да
но проще для поддержки писать по возможности один большой скрипт, чем разбивать проект на кучи разных составляющих (схемы, пакеты, диаграммы и т.п.)

т.е. если позволяют обстоятельства, лучше создать несколько процедур, чем создавать еще и пакеты. Но это уже субъективные привычки со своими достоинствами и недостатками. Лучше здесь это не обсуждать, чтобы не скатиться в холивар.

речь изначально шла о том, как получить код ошибки, возвращаемый приложением (в частности dir.exe)
5 дек 16, 16:36    [19968982]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
Владислав Колосов
Member

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

так или иначе, но я бы написал простое приложение, хоть на VBS, и не использовал бы для целей загрузки сам сервер. FSO, например, имеет хорошие возможности для поиска, копирования файлов и директорий и т.д. Скриптом можно вызвать тот же пакет DTS или приложение BCP для загрузки данных на сервер.
5 дек 16, 16:55    [19969096]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
нуб987
Guest
Владислав Колосов
Скриптом можно вызвать тот же пакет DTS или приложение BCP для загрузки данных на сервер.

а чем bulk insert плох?
я проверяю наличие файла dir'ом (хочу получать код ошибки), а потом заливаю bulk insert'ом
5 дек 16, 17:00    [19969124]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
Владислав Колосов
Member

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

не плох, его также можно внешним скриптом вызвать. Права сисадмина для загрузки не потребуются, в отличие от xp_cmdshell.
5 дек 16, 17:41    [19969324]     Ответить | Цитировать Сообщить модератору
 Re: получить код ошибки xp_cmdshell  [new]
tunknown
Member

Откуда:
Сообщений: 766
нуб987
как получить код выполнения самого dir, а не процедуры?

Предлагаю создать .cmd файл с командой dir. В конце файла дописать echo %errorlevel%. Запускать этот файл вместо dir. Либо использовать Redirection(&).

insert #temp
exec @iError= master..xp_cmdshell @sCmd

Парсить последнюю строку полученного в #temp результата.
6 дек 16, 17:16    [19973556]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить