Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Вниз

Обработка ошибок в MSSQL   Найти похожие ветки 

 
Vick   (2003-12-04 18:01) [0]

Доброго всем вечера!!!

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

Задача такая: идет запись данных в таблицу в цикле, на каком-то конкретном шаге попадается запись с неверной датой, типа 01.12.1003, возникает ошибка Error converting data type DBTYPE_DBDATE to datetime и выполнение процедуры обрывается, а я хочу, чтобы процесс продолжался дальше...


 
me   (2003-12-04 21:18) [1]

Нет, так сделать нельзя. Более того - это ИМНО "дурной тон" при работе с сервером, который всегда обновляет данные в контексте транзакции


 
Vick   (2003-12-05 10:38) [2]

А что же тогда делать, так же все время будет натыкаться процесс а неправильный файл и останавливаться и не будет возможности выяснить, какой файл неверен, кроме как перебором. :(((( Или может есть другой способ?


 
sniknik   (2003-12-05 10:55) [3]

> А что же тогда делать
ISDATE не поможет? предварительно чтобы не доводить до исключения.

насчет остального, не зная задачи...


 
Nikolay M.   (2003-12-05 10:59) [4]


> А что же тогда делать,

Например, апдейтить в цикле, в теле курсора.


 
sniknik   (2003-12-05 11:06) [5]

Nikolay M. © (05.12.03 10:59) [4]
необязательно (хотя может быть это для его процедуры это самое естественное), можно просто CASE в запрос вставить (если вставка запросом).


 
Vick   (2003-12-05 11:15) [6]

>sniknik

Задача в первом мессадже описана.
Но в дополнение - это все та же задача, что была и в Линке к другому серверу: приходят отчеты в dbf-ном формате, я должна закачать их в базу.
Тут такая фигня, что я заранее не знаю в каком поле в dbf-ом файле может быть какая-нть гадость, при этом обязательно возникнет ошибка и прервется работа совсем.


 
sniknik   (2003-12-05 11:21) [7]

Vick © (05.12.03 11:15) [6]
> Задача в первом мессадже описана.
хотелось бы подробностей, на описание в общем виде и ответы будут анологичными. а как показывает практика их обычно "не понимают".
вспомни прошлую ветку, ответ был в первых же постах.

> ISDATE не поможет?
????


 
Vick   (2003-12-05 11:32) [8]

>sniknik

Описываю задачу по шагам:

1. Филиалы каждый вечер высылают свои отчеты в формате dbf в офис.

2. В офисе эти отчеты нужно загрузить в базу MSSQL в таблицу с аналогичными полями.

3. Отчетики я гружу в цикле сначала во временную таблицу (дабы уберегтись от повторной загрузки файла, ибо народ имеет привычку высылать по несколько раз одно и то же). Заранее я не знаю какая ошибка и в каком поле может быть сгенерирована глупым юзером. посему контролировать все 27 полей на наличие в них ошибок не имеет смысла. Может еще такая ситуация случиться, что файл будет битым (контрольная сумма не будет сходиться или еще чего-нть), следовательно при его чтении тоже возникнет ошибка.

4. Так вот, в процессе загрузки во временную таблицу, например, пятого файлика возникает ошибочка. Так вот я хочу этот файлик просто пропустить и перейти на следующий шаг цикла при возникновении оной.

Вот и вся задачка!!! :)))


 
LordOfSilence   (2003-12-05 11:41) [9]

DTS-packages с ActiveX-скриптами


 
sniknik   (2003-12-05 11:47) [10]

Vick © (05.12.03 11:32) [8]
у нас разное понимание подробностей. :о((

не нужно то как тебе начальство должно задачу ставить. нужно описание структур таблиц, типы, провайдеры, как решаеш. код. где сложности (место в коде).

LordOfSilence © (05.12.03 11:41) [9]
???
у него судя по описанию (как я понял) в том же поле текстовом может быть как дата так и ахинея. как написать скрипты это и есть проблема.

Vick © (05.12.03 11:32) [8]
см. сюда LordOfSilence © (05.12.03 11:41) [9]
это и есть решение (одно из) но в общем (как я и говорил).


 
Vick   (2003-12-05 11:55) [11]

>sniknik

Ну не обижай меня, я - ОНА!!! :)))

Привожу кусок кода:

DECLARE @hFiles varchar(8);
declare @S varchar(2000)

declare ID_CURSOR cursor local read_only FAST_FORWARD
for (select substring(files,1,8) as Files from #temp where files like "%pal%")

OPEN ID_CURSOR;
fetch next from ID_CURSOR into @hFiles;
while @@FETCH_STATUS = 0
begin
if @hFiles not in(select distinct [file_name] from palmira_test.dbo.SHOP_REPORTS
where [file_name] = @hfiles) begin
set @S =
"insert into #shop_reports([FILE_NAME], DIVISION, DIVISION_C, TYPE_DOC, NUM_DOC, ARTICUL,
CODE_EKKA, GROUPE_COD, GROUPE_TEX, DIV_COD, DIV_TEXT, NALOG_COD, NAME_EKKA, FCOD, NUMBER, PRICE,
PRICE_NEW, PRICE_CH, DAT_, DATE_NEW, DATE_CH, CLIENT_NAM, CLIENT_COD, CLIENT_ADR, COMMENT)
Select """ + @hFiles + """, DIVISION, DIVISION_C, TYPE_DOC, NUM_DOC, ARTICUL,
CODE_EKKA, GROUPE_COD, GROUPE_TEX, DIV_COD, DIV_TEXT, NALOG_COD, NAME_EKKA, FCOD, NUMBER, PRICE,
PRICE_NEW, PRICE_CH, DATE,
case when DATE_NEW = null then DATE else DATE_NEW end as DATE_NEW,
DATE_CH, CLIENT_NAM, CLIENT_COD, CLIENT_ADR, COMMENT
FROM OPENROWSET(""MSDASQL"",""DRIVER={Microsoft dBase Driver (*.dbf)}"",
""select * from d:\Mail\" + @hFiles + ".dbf"")";
exec(@S);
insert into Palmira_test.dbo.LOG_MAIL
select getdate(), "Загружен", @hFiles
end else
insert into Palmira_test.dbo.LOG_MAIL
select getdate(), "Такой файл уже есть", @hFiles
fetch next from ID_CURSOR into @hFiles;
end;
CLOSE ID_CURSOR;

insert into Palmira_test.dbo.Shop_reports
select * from #shop_reports

DEALLOCATE ID_CURSOR;

exec master..xp_cmdshell "del d:\Mail\??pal???.dbf"


А как DTS-packages написать, чтобы он брал файлы, которые мне нужны, их имя каждый день меняется!!!!


 
sniknik   (2003-12-05 12:20) [12]

судя по всему проблема в запросе "insert into #shop_reports ... далее по тексту

вставь в OPENROWSET запрос поподробнее с полями
проблемные с датой оформи так (примерно)

вместо DATE_NEW к примеру (синтаксис MSSQL)
CASE ISDATE(DATE_NEW)
WHEN 1 THEN DATE_NEW
ELSE Null
END AS DATE_NEW
запрос должен продолжатся (просто неправильное поле будет пустым).
но вообшето OPENROWSET передает запрос провайдеру (в твоем случае ODBC dBase Driver) так что такой синтаксис скорее всего не пройдет
можно несколько вариантов попробовать
сменить OPENROWSET на OPENDATASOURCE (тогда синтаксис подойдет) он уже в MSSQL будет разбирать
либо написать так (тоже замена)
iif(isDate(DATE_NEW), DATE_NEW, Null) AS DATE_NEW
(это синтаксис jet) пройдет (скорее всего) в ODBC dBase Driver если jet был установлен
не пройдет сменить провайдера на jet.


 
Vick   (2003-12-05 12:31) [13]

а как быть с вариантом, когда файл битый в принцыпе (могут умники послать ярлык переименованный или какой другой файл)...
и даже если у него проблема олько с датой, то мне его нужно отбросить и записать в таблицу логов, что в этом файле ошибка...


 
sniknik   (2003-12-05 12:45) [14]

Vick © (05.12.03 12:31) [13]
а вот этого условия в вопросе не было. ;о))

это проверить проще до запуска sql-ной процедуры. (мне так кажется)


 
Vick   (2003-12-05 13:29) [15]

Как по мне - проще нажать кнопку - принять почту, а потом кнопку принять отчеты в программе.

Но начальство решило прыгнуть выше головы, посему все должон выполнять SQL.


 
LordOfSilence   (2003-12-05 13:34) [16]

В DTS-package есть возможность выполнить external task


 
sniknik   (2003-12-05 14:22) [17]

> посему все должон выполнять SQL.
т.е. процедура запускается из job-а? если все на SQL.

тогда причем сдесь D5? если же всетаки причем то зачем кнопка? поток и слежение за почтовой директорией и все будет на автомате. (external task по моему будет гораздо сложнее, да и приемка будет дискретной (по определенным часам), а так почти в реале)


 
LordOfSilence   (2003-12-05 14:34) [18]

2 sniknik © (05.12.03 14:22) [17]
это я к тому, что можно написать маленький делфийский таск,
а начальство будет по-прежнему думать, что "у нас все чисто на SQL" :-)


 
ppcat   (2003-12-05 15:15) [19]

Да на сервере тоже можно ошибки ловить:

... Кусок кода SQL где могут быть ошибки ...
if (@@ERROR > 0)
begin
exec master..xp_cmdshell
"@echo "мать, мать, мать, такой-то файл... >> err.log"
или
raiserror("мать, мать, мать, такой-то файл...",16,-1)
end


 
Vick   (2003-12-05 15:21) [20]

>LordOfSilence

Начальство меня и близко к серверу не подпускает, сижу тут как в танке!!!

Сейчас загрузка отчетов работает через делфи - и никаких проблем, следовательно проблемы нужно создать, чтобы показать видимость работы...

>sniknik

Процедура действительно запускается из job-а, и все работает классно (прием почты, загрузка отчетов) до того момента, пока не появится корявый файл.

Хорошо, а можно ли продолжить работу следуюих действий процедуры после сбоя в этой транзакции? Или это в принцыпе не возможно?


 
Vick   (2003-12-05 15:22) [21]

>ppcat

Ну словиться ошибка, и прекратит работу процедуры навечно, а мне нужно продолжить!!!! Или нет?


 
Конструктор   (2003-12-05 15:30) [22]

>Vick
На основании Vick © (05.12.03 11:32) [8] - у вас прежде всего технологическая проблема и раз вы работаете в банке, то постройте правильно банковскую технологию:формирование данных –отправка –прием-сохранение данных-формирование отчетности.
Если вы будете в текстовых полях хранить даты, суммы,то имея на входе мусор – и получите мусорный отчет и задачку свою не решите.
Я бы сделал так:
1. Как рекомендовали мастера (sniknik © (05.12.03 11:47) [10] )– утвердите структуры данных в dbf и MSSQL, которые обеспечат правильный ввод данных именно в dbf и назначьте ответственных за этот ввод.
2. На MSSQL создайте пару сервисных табличек, хранящих информацию о процессе загрузки типа сеанс загрузки и основные данные о приходящей информации по файлам.
3.Напишите загрузчик (dbf->MSSQL) на Delphi.
4.А отчеты получайте вашим инструментарием. Вы про него ничего не написали.

Успехов в банковской автоматизации.


 
Vick   (2003-12-05 15:37) [23]

>Конструктор

Супер!!!!! Именно так все сейчас и работет!!!! Но как я написала в [20] мы придумываем проблемы из ничего, посему нам уже делфи надоел со своими кнопками, нам нужно загружать отчеты силой мысли... На самом деле даты хранятся в полях типа "дата", но юзер может загнать дату типа 01.01.1003 - чем не дата???? Но умный SQL начинает свою жизнь с 01.01.1753 :)))))) Для него это не дата..... А такие отчеты мне грузить нельзя, т.к. потом из принцыпу звониться в филиал и возиться его мордой по радиатору!!!!

И что самое страшное - это не банк!!!!! Это МАГАЗИНЫ!!!!!!!


 
Artem03   (2003-12-05 15:47) [24]

CREATE PROCEDURE spDelCountry
@ID int
AS

DELETE FROM Countries WHERE ID = @ID
IF (@@ERROR <> 0)
BEGIN
RAISERROR ("Ошибка выполнения ХП", 16, 1)
ROLLBACK TRANSACTION
END

Вот этот RAISEERROR надо отловить и подавить вывод системного сообщения.

try
...
ADOCommand.Execute
except
on E: EOleException do Message("EOleException : "+ E.Message); end;

EOleException : Ошибка выполнения ХП


 
ppcat   (2003-12-05 16:27) [25]

В [20] и [21] был вопрос: будет ли хранимая процедура продолжать работать после ошибки?

Нет, она действительно прервется, но выход есть. Если загрузку файла поручить другой процедуре, то она-то и срубится, а в вызывающей просто проверить результат. Если файл не загрузился, пропустить эту итерацию.


 
Конструктор   (2003-12-05 16:28) [26]

>Vick
>посему контролировать все 27 полей на наличие в них ошибок не имеет смысла.
Но к сожалению придется, и я рекомендую встраивать контроль в софт в филиале для полей по которым строиться отчет, если конечно этот отчет нужен бизнесу.
P.S.
1.Интересно посмотреть на лицо клиента, которому выдали документы на туристическую поездку на 01.12.1003 или платежку на аналогичную дату.
2.Не рекомендую связываться с курсорами в MSSQL


 
Delirium   (2003-12-05 16:30) [27]

"делфи надоел со своими кнопками, нам нужно загружать отчеты силой мысли... " - приведи дельфёвый проект к Extended Stored Procedure и все дела - начальство довольно, и ты создала "видимость работы" :)))


 
sniknik   (2003-12-05 17:08) [28]

дельфи он не обязательно с кнопками. о, мудрая мысль (!!!). ;о)))

Vick © (05.12.03 15:37) [23]
> И что самое страшное - это не банк!!!!! Это МАГАЗИНЫ!!!!!!!
в какой системе работаеш? а то может конкуренту помагаю... :о))


 
Vick   (2003-12-05 17:21) [29]

>Конструктор
В филиале с кассой работает программа утвержденная налоговой испекцией, она то и формирует эти файл отчетов, так что у меня к ним никакого доступа, кроме как почитать их.... Да собственно никто другого и не даст сделать.

На данный момент нужно решить докальную задачу: принять отчеты, загрузить, те которые не грузятся откинуть и грузить дальше остальные


 
sniknik   (2003-12-05 17:48) [30]

Удалено модератором


 
Vick   (2003-12-05 17:55) [31]

Удалено модератором


 
LordOfSilence   (2003-12-05 18:06) [32]

Постарайся показать себя специалистом, который ПРЕДЛАГАЕТ
технические решения и пути выхода из затруднительных ситуаций,
иначе тебе придется идти на поводу у дилентантов в области
автоматизации. В итоге будет хуже всем.


 
MDFE   (2003-12-07 06:31) [33]

>Процедура действительно запускается из job-а, и все работает классно (прием почты, загрузка отчетов) до того момента, пока не появится корявый файл.

По опыту, при любых(?которые мне попадались) ошибках job заканчивает свою работу

>А что же тогда делать, так же все время будет натыкаться процесс а неправильный файл и останавливаться и не будет возможности выяснить, какой файл неверен, кроме как перебором. :(((( Или может есть другой способ?

Динамично создать job, в job`e - step с @step_name="имя обрабатываемого файла" и телом из @S, и запустить.

>и не будет возможности выяснить, какой файл неверен, кроме как перебором.

в job history смотрим result - @step_name у нас название файла



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.015 c
6-99681
ИМХО
2003-10-31 03:21
2003.12.30
TWebBrowser


7-99805
cashe
2003-10-23 01:15
2003.12.30
Определить скорость чтения/записи HDD


3-99444
hursand
2003-12-06 11:32
2003.12.30
Использоват хранимых процедур


3-99493
fantomas
2003-12-04 12:16
2003.12.30
InterBase


6-99679
All
2003-10-24 15:13
2003.12.30
Проблемы с приёмом почты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский