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

Откуда:
Сообщений: 9
есть таблица с полем pole1 типа varchar(30)
В рамках хп производится перенос данных в др. таблицу
select ...
into #table2 
from table1

При этом производится преобразование данных из типа varchar(30) в int
cast(pole1 as int)
но значение может быть несоответствующим и генерится ошибка и хп вываливается. Можно ли как-то реализовать обработку исключительной ситуации типа try except в рамках хп
29 апр 05, 12:13    [1508049]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки  [new]
zass
Member

Откуда: Minsk
Сообщений: 1043
Можно организовать транзакцию, и затем ее откатить в критический момент...
29 апр 05, 12:16    [1508075]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Сразу после:
if @@error != 0 ...
29 апр 05, 12:18    [1508082]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки  [new]
heizer
Guest
можно попробовать:

select ...
into #table2
from table1 where isnumeric(pole1)=1

хотя там есть кое-какие нюансы.
29 апр 05, 12:21    [1508094]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки  [new]
ssvssv
Member

Откуда:
Сообщений: 9
zass
Можно организовать транзакцию, и затем ее откатить в критический момент...


Смысл в том, чтобы по возможности перегнать данные, а если возникнет ошибка, то просто при перегоне в др. таблицу оставить поле пустым, но перегнать все записи нужно обязательно
29 апр 05, 14:24    [1508653]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки  [new]
ssvssv
Member

Откуда:
Сообщений: 9
heizer
можно попробовать:

select ...
into #table2
from table1 where isnumeric(pole1)=1

хотя там есть кое-какие нюансы.


isnumeric не катит, пробовал, проблема в том, что есть, например, запись '1234567890123', это numeric, но не int
29 апр 05, 14:27    [1508660]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
ssvssv
zass
Можно организовать транзакцию, и затем ее откатить в критический момент...


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

Тогда задача сводится к тому, чтобы выбрать все валидные данные, а невалидные заменить null. Можно начать, как уже советовали, с isnumeric.
29 апр 05, 14:27    [1508661]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки  [new]
ssvssv
Member

Откуда:
Сообщений: 9
Гавриленко Сергей Алексеевич
ssvssv
zass
Можно организовать транзакцию, и затем ее откатить в критический момент...


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

Тогда задача сводится к тому, чтобы выбрать все валидные данные, а невалидные заменить null. Можно начать, как уже советовали, с isnumeric.


isnumeric не проходит: вообще весь запрос приблизительно такой
Create table #i_SMUKM_CASHLOG_PROM
(	SHOPINDEX int,
	CASHNUMBER int,
	ZNUMBER int,
	CHECKNUMBE int,
	[DATE] datetime,
	[TIME] int,
	SECHUN int,
	CASHIER int,
	OPERID int,
	[NAME] varchar(30))
.....
.....
.....

select 
	SHOPINDEX,
	CASHNUMBER,
	ZNUMBER,
	[DATE]+cast(substring('0000'+cast([TIME] as varchar(4)),LEN('0000'+cast([TIME] as varchar(4)))-3,2)+':'+substring('0000'+cast([TIME] as varchar(4)),LEN('0000'+cast([TIME] as varchar(4)))-1,2)+':'+cast(cast(substring('0000'+cast([SECHUN] as varchar(4)),LEN('0000'+cast([SECHUN] as varchar(4)))-3,2) as int)%60 as varchar(2))+'.'+cast(substring('0000'+cast([SECHUN] as varchar(4)),LEN('0000'+cast([SECHUN] as varchar(4)))-1,2) as varchar(2)) as datetime) as HMS,
	([Time]*10000+[SECHUN])  sorttime,
	CHECKNUMBE,
	CASHIER,
	OPERID,
	[NAME],
	CASE  
		WHEN OPERID=2 THEN cast(dbo.fn_Convert_string([NAME],1)   as int)
		WHEN OPERID=5  AND ([NAME] IS NOT NULL) AND [NAME]<>'' THEN cast(substring([NAME],1,CHARINDEX(';',[name])-1) as int)
		WHEN OPERID=6  AND ([NAME] IS NOT NULL) AND [NAME]<>'' AND CHARINDEX(';',[name])>0 THEN cast(substring([NAME],1,CHARINDEX(';',[name])-1) as int)
		ELSE 0
	END AS ArticleID,
	CASE  
		WHEN OPERID=5  AND ([NAME] IS NOT NULL) AND [NAME]<>'' THEN cast(substring([NAME],CHARINDEX(';',[name])+1, CHARINDEX(';',[name],CHARINDEX(';',[name])+1)-CHARINDEX(';',[name])-1) as float)
		WHEN OPERID=6  AND ([NAME] IS NOT NULL) AND [NAME]<>'' THEN cast(substring([NAME],CHARINDEX(';',[name])+1, CHARINDEX(';',[name],CHARINDEX(';',[name])+1)-CHARINDEX(';',[name])-1) as float)
		ELSE 0
	END AS DopInfo,
	CASE  
		WHEN OPERID=5  AND ([NAME] IS NOT NULL) AND [NAME]<>'' THEN cast(replace(replace(substring([NAME],CHARINDEX(';',[name])+1, CHARINDEX(';',[name],CHARINDEX(';',[name])+1)-CHARINDEX(';',[name])-1),',',''),'N','') as float)
		WHEN OPERID=6  AND ([NAME] IS NOT NULL) AND [NAME]<>'' THEN cast(replace(replace(substring([NAME],CHARINDEX(';',[name])+1, CHARINDEX(';',[name],CHARINDEX(';',[name])+1)-CHARINDEX(';',[name])-1),',',''),'N','') as float)
		WHEN OPERID in (9,10,16,17,30) AND [NAME]<>'' AND [NAME]<>'+' AND [NAME]<>'N'  THEN cast(replace(replace(replace([NAME],',',''),'N',''),'+','') as float)
		ELSE 0
	END AS BaseSum
into #i_SMUKM_CASHLOG 
from #i_SMUKM_CASHLOG_PROM
order by [date],sorttime


данные обрабатываются в ХП, и каждый день нахожу в поле [name] все новые глюки, т.е. кривые данные. Исходные данные генерит др. прога, ее переделать нет возможности и что она пишет в таблицу в зависимости от действий пользователей для меня остается загадкой
29 апр 05, 14:38    [1508700]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить