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

Откуда:
Сообщений: 2253
Собственно, вопрос в названии темы, как узнать/получить PK записей на которых произошла ошибка?

Вот тестовый пример, как "выцепить", что PK нарушен для значения "1":

create table #t (f1 int primary key)
go

begin try
begin transaction 

insert into #t output inserted.* values (1), (2), (1) --output inserted.*

commit transaction 
END TRY

	BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

	-- возникла ошибка, проверяем на открытую не зафиксированную транзакцию

		IF XACT_STATE() <> 0
		    BEGIN
				ROLLBACK TRANSACTION
		END
	END CATCH
	
go 

drop table #t	
9 апр 13, 10:35    [14155082]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
а можно подробнее о предназначении этого всего отлова ошибок?
просто нежелание использовать SET XACT_ABORT или я чего-то не понимаю?
9 апр 13, 10:45    [14155153]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
PaulWist
Собственно, вопрос в названии темы, как узнать/получить PK записей на которых произошла ошибка?

Вот тестовый пример, как "выцепить", что PK нарушен для значения "1":
В смысле "как узнать"? Прочитать сообщение об ошибке, там же написано.
9 апр 13, 10:51    [14155196]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
alexeyvg
PaulWist
Собственно, вопрос в названии темы, как узнать/получить PK записей на которых произошла ошибка?

Вот тестовый пример, как "выцепить", что PK нарушен для значения "1":
В смысле "как узнать"? Прочитать сообщение об ошибке, там же написано.


Э-э-э, у меня вызвращает следующую строку ошибки, в которой нет упоминания, что ошибка возникла при нарушении РК = 1

ErrorNumber ErrorSeverity ErrorState  ErrorProcedure    ErrorLine   ErrorMessage
----------- ------------- ----------- ---------------
2627        14            1           NULL               5           Нарушение "PK__#t________32139E580A7378A9" ограничения PRIMARY KEY. Невозможно вставить повторяющийся ключ в объект "dbo.#t".


Какие функции о возврате ошибки Вы используете, что бы в ней было указано, что нарушение произошло на РК = 1 ?
9 апр 13, 11:01    [14155268]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
PaulWist,

а если вставляю миллион записей, и каждая нарушает уникальность PK.
Что бы Вы хотели получить в результате? Миллион значений PK?
9 апр 13, 11:02    [14155271]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Glory
Member

Откуда:
Сообщений: 104751
PaulWist
Э-э-э, у меня вызвращает следующую строку ошибки, в которой нет упоминания, что ошибка возникла при нарушении РК

И какая разница ?
Берите свой набор данных и запросом ищите в нем дубликаты
9 апр 13, 11:04    [14155285]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
Паганель
а можно подробнее о предназначении этого всего отлова ошибок?
просто нежелание использовать SET XACT_ABORT или я чего-то не понимаю?


1. "Заливаю" из внешнего источника, уже "упарился" править кривизну данных, хотелось бы авторам данных отдать список записей, что бы они сами правили своё творчество :)

2. Ну и для себя, тоже полезная фича - узнать где сам накосячил.
9 апр 13, 11:06    [14155310]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
iap
PaulWist,

а если вставляю миллион записей, и каждая нарушает уникальность PK.
Что бы Вы хотели получить в результате? Миллион значений PK?


Такое даже было бы лучшн всего, сразу иметь все косяки.
9 апр 13, 11:08    [14155326]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
PaulWist
1. "Заливаю" из внешнего источника, уже "упарился" править кривизну данных, хотелось бы авторам данных отдать список записей, что бы они сами правили своё творчество :)
сказать авторам, что в ихних данных есть дубли
хай сами ищут, это их проблема
9 апр 13, 11:09    [14155333]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
Glory
PaulWist
Э-э-э, у меня вызвращает следующую строку ошибки, в которой нет упоминания, что ошибка возникла при нарушении РК

И какая разница ?
Берите свой набор данных и запросом ищите в нем дубликаты


РК - это просто пример, как Вы понимаете ошибку можно словить и на FK и на Check и тп.
9 апр 13, 11:10    [14155343]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Glory
Member

Откуда:
Сообщений: 104751
PaulWist
РК - это просто пример, как Вы понимаете ошибку можно словить и на FK и на Check и тп.

И что ?
Добавляейте по одной записи - будете все знать точно
9 апр 13, 11:12    [14155349]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
Glory
PaulWist
РК - это просто пример, как Вы понимаете ошибку можно словить и на FK и на Check и тп.

И что ?
Добавляейте по одной записи - будете все знать точно


ОК, переформируем пример, как на Ваш взгляд должна выглядеть операция добавления по одной записи?


create table #Heap (f1 int)
insert into #Heap  values (1), (2), (1) 
go
create table #t (f1 int primary key)
go

begin try
begin transaction 

-- Что написать вместо этого оператора?
-- Declare Cursor?
insert into #t select f1 from #Heap
--
--

commit transaction 
END TRY

	BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

	-- возникла ошибка, проверяем на открытую не зафиксированную транзакцию

		IF XACT_STATE() <> 0
		    BEGIN
				ROLLBACK TRANSACTION
		END
	END CATCH
	
go 

drop table #t	
drop table #Heap	
9 апр 13, 11:19    [14155397]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Glory
Member

Откуда:
Сообщений: 104751
PaulWist
ОК, переформируем пример, как на Ваш взгляд должна выглядеть операция добавления по одной записи?

Как добавление одной записи. В цикле
9 апр 13, 11:21    [14155410]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
PaulWist
Э-э-э, у меня вызвращает следующую строку ошибки, в которой нет упоминания, что ошибка возникла при нарушении РК = 1

Какие функции о возврате ошибки Вы используете, что бы в ней было указано, что нарушение произошло на РК = 1 ?
А у меня возвращает в поле ErrorMessage:
Violation of PRIMARY KEY constraint 'PK__#t________32139E581D27F118'. Cannot insert duplicate key in object 'dbo.#t'. The duplicate key value is (1).

Ничего не менял. У меня 2008R2
9 апр 13, 11:22    [14155416]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
alexeyvg
PaulWist
Э-э-э, у меня вызвращает следующую строку ошибки, в которой нет упоминания, что ошибка возникла при нарушении РК = 1

Какие функции о возврате ошибки Вы используете, что бы в ней было указано, что нарушение произошло на РК = 1 ?
А у меня возвращает в поле ErrorMessage:
Violation of PRIMARY KEY constraint 'PK__#t________32139E581D27F118'. Cannot insert duplicate key in object 'dbo.#t'. The duplicate key value is (1).

Ничего не менял. У меня 2008R2


У меня

select @@version

Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
	Jul  9 2008 14:43:34 
	Copyright (c) 1988-2008 Microsoft Corporation
	Standard Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)


текст ошибки привёл полностью, странно???. Мож где-то надо настройки подкрутить?
9 апр 13, 11:30    [14155471]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
Glory
PaulWist
ОК, переформируем пример, как на Ваш взгляд должна выглядеть операция добавления по одной записи?

Как добавление одной записи. В цикле


ОК, можете привести пример добавления по одной записи "в цикле"?
9 апр 13, 11:45    [14155612]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Glory
Member

Откуда:
Сообщений: 104751
PaulWist
ОК, можете привести пример добавления по одной записи "в цикле"?

while <тут проверка условия цикла>
begin
insert mytable values/select
end
9 апр 13, 11:47    [14155627]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PaulWist
Мож где-то надо настройки подкрутить?

Нечего крутить. Шаблон текста ошибки (на английском и на русском) можно посмотреть таким запросом:
select text from sys.messages where message_id = 2627 and language_id in (1033, 1049)

На 2008R2 SP1 у меня возвращается такое:
Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'. The duplicate key value is %ls.
Нарушение "%2!" ограничения %1!. Не удается вставить повторяющийся ключ в объект "%3!". Повторяющееся значение ключа: %4!.
На 2005 SP4 — такое:
Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.
Нарушение "%2!" ограничения %1!. Невозможно вставить повторяющийся ключ в объект "%3!".
То есть где-то в промежутке между этими версиями добавился вывод повторяющегося значения ключа. Не исключено даже, что в каком-то сервис-паке для 2008.
9 апр 13, 11:52    [14155674]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
Glory
PaulWist
ОК, можете привести пример добавления по одной записи "в цикле"?

while <тут проверка условия цикла>
begin
insert mytable values/select
end


Glory

Ну да, ... Спасибо :)
9 апр 13, 11:56    [14155721]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
Гость333
PaulWist
Мож где-то надо настройки подкрутить?

Нечего крутить. Шаблон текста ошибки (на английском и на русском) можно посмотреть таким запросом:
select text from sys.messages where message_id = 2627 and language_id in (1033, 1049)

На 2008R2 SP1 у меня возвращается такое:
Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'. The duplicate key value is %ls.
Нарушение "%2!" ограничения %1!. Не удается вставить повторяющийся ключ в объект "%3!". Повторяющееся значение ключа: %4!.
На 2005 SP4 — такое:
Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.
Нарушение "%2!" ограничения %1!. Невозможно вставить повторяющийся ключ в объект "%3!".
То есть где-то в промежутке между этими версиями добавился вывод повторяющегося значения ключа. Не исключено даже, что в каком-то сервис-паке для 2008.


Гость333

Спасибо, уже посмотрел.

Вопрос такой, можно ли проапдейтить sys.messages.text = Нарушение "%2!" ограничения %1!. Не удается вставить повторяющийся ключ в объект "%3!". Повторяющееся значение ключа: %4!.
9 апр 13, 11:58    [14155747]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PaulWist
Вопрос такой, можно ли проапдейтить sys.messages.text = Нарушение "%2!" ограничения %1!. Не удается вставить повторяющийся ключ в объект "%3!". Повторяющееся значение ключа: %4!.

Сам текст ошибки, думаю, можно проапдейтить. Только что это даст? Надо же ещё как-то передавать "значение ключа: %4!".
9 апр 13, 12:00    [14155761]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
PaulWist
Member

Откуда:
Сообщений: 2253
Гость333
PaulWist
Вопрос такой, можно ли проапдейтить sys.messages.text = Нарушение "%2!" ограничения %1!. Не удается вставить повторяющийся ключ в объект "%3!". Повторяющееся значение ключа: %4!.

Сам текст ошибки, думаю, можно проапдейтить. Только что это даст? Надо же ещё как-то передавать "значение ключа: %4!".


Не даёт (и правильно):

Сообщение 259, уровень 16, состояние 1, строка 2
Нерегламентированные обновления системных каталогов запрещены.


Понял.
9 апр 13, 12:03    [14155786]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
Используя буферную таблицу и метаданные ограничений, можно сгенерировать запросы, которые отсеют невалидные строки.
9 апр 13, 12:14    [14155869]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PaulWist
Не даёт (и правильно):

Сообщение 259, уровень 16, состояние 1, строка 2
Нерегламентированные обновления системных каталогов запрещены.

Так просто, понятно, не даёт. Подобные вещи делают через DAC.
9 апр 13, 12:22    [14155913]     Ответить | Цитировать Сообщить модератору
 Re: Узнать PK на котором произошла ошибка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
PaulWist
alexeyvg
пропущено...
А у меня возвращает в поле ErrorMessage:
Violation of PRIMARY KEY constraint 'PK__#t________32139E581D27F118'. Cannot insert duplicate key in object 'dbo.#t'. The duplicate key value is (1).

Ничего не менял. У меня 2008R2


У меня

select @@version

Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
	Jul  9 2008 14:43:34 
	Copyright (c) 1988-2008 Microsoft Corporation
	Standard Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)


текст ошибки привёл полностью, странно???. Мож где-то надо настройки подкрутить?
В 2008м это появляется после какого-то сервиспака. Обновляйтесь уже, негоже на RTM сидеть.
9 апр 13, 12:27    [14155935]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить