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

Откуда: Київ
Сообщений: 10428
Делаю таблицу и к ней constraint, задача - игнорировать дубликаты

CREATE TABLE #Big (pk int NOT NULL PRIMARY KEY, name nvarchar (128) not null default N'name',
CONSTRAINT [UQ_idk] UNIQUE NONCLUSTERED 
([pk] ASC) WITH (IGNORE_DUP_KEY = ON)
)
GO
INSERT #Big (pk) VALUES (1), (2), (3);
GO
GO
-- Key 3 is a duplicate, just a warning now
INSERT #Big (pk) VALUES (3), (4), (5);
GO
SELECT pk FROM #Big;


Если пускаю в одном окне SSMS - ок, тут же во втором - ошибка:

Msg 2714, Level 16, State 5, Line 3
There is already an object named 'UQ_idk' in the database.
Msg 1750, Level 16, State 0, Line 3
Could not create constraint. See previous errors.


как обойти?
4 фев 16, 20:37    [18774678]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
invm
Member

Откуда: Москва
Сообщений: 9723
CREATE TABLE #Big
(
 pk int NOT NULL PRIMARY KEY, name nvarchar (128) not null default N'name',
 UNIQUE NONCLUSTERED ([pk] ASC) WITH (IGNORE_DUP_KEY = ON)
);
4 фев 16, 20:44    [18774692]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Можно ещё просто создать уникальный индекс с нормальным именем без констрейнта.
5 фев 16, 10:01    [18775960]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Как не умел и не хотел ТС читать хелп, так и продолжает

constraint_name
Is the name of a constraint. Constraint names must be unique within the schema to which the table belongs.
5 фев 16, 10:05    [18775989]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Как не умел и не хотел ТС читать хелп, так и продолжает

constraint_name
Is the name of a constraint. Constraint names must be unique within the schema to which the table belongs.


Я просил подсказку по решению проблемы, это я знаю, собственно, потому и вопрос задал, никакого противоречия.
5 фев 16, 10:29    [18776104]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
Я просил подсказку по решению проблемы

Проблема создания объекта с уникальным именем решается выдачей/написанием/генерацией этого уникального имени
5 фев 16, 10:32    [18776122]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Mike_za
Member

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

С уникальными именами констрейнтов в процедурах таблицы не кешируются
5 фев 16, 10:44    [18776179]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Если в процедуре сделать временную таблицу, в ней такой

CONSTRAINT [UQ_idk] UNIQUE NONCLUSTERED 
([pk] ASC) WITH (IGNORE_DUP_KEY = ON)
)



имеем следующее:

1. при запуске процедуры руками в SSMS - все работает, выдается одно безобидное сообщение
Duplicate key was ignored

, но возвращается рекордсет, всё ок.

2. при вызове этой же процедуры из приложения через ОЛЕДБ получаем ошибку вызова и как следствие пустой рекордсет

Я так понимаю проигнорировать или задавить это сообщение, а по сути генерацию ошибки после завершения в процедуре не получится?
11 фев 16, 15:31    [18804614]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
iap
Member

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

так даже запустить процедуру в двух разных сессиях не получится.
Надо создавать констрейнт в CREATE TABLE и без явного имени.
11 фев 16, 15:35    [18804638]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
Winnipuh,

так даже запустить процедуру в двух разных сессиях не получится.
Надо создавать констрейнт в CREATE TABLE и без явного имени.


да, так как выше подсказали

CREATE TABLE #Big
(
 pk int NOT NULL PRIMARY KEY, name nvarchar (128) not null default N'name',
 UNIQUE NONCLUSTERED ([pk] ASC) WITH (IGNORE_DUP_KEY = ON)
);


но вопрос в том, как такую процедуру вызывать из приложения, что-то перетопили авторы, вроде и варнинг, а валит вызов с ошибкой
11 фев 16, 15:51    [18804757]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Владислав Колосов
Member

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

с каким сообщением ошибка?
11 фев 16, 15:55    [18804801]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
но вопрос в том, как такую процедуру вызывать из приложения,

Програмировать нужно правильно приложение.
Т.е. различать, что вам возвращает сервер.
11 фев 16, 15:57    [18804812]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
но вопрос в том, как такую процедуру вызывать из приложения,

Програмировать нужно правильно приложение.
Т.е. различать, что вам возвращает сервер.


различил и что дальше?
11 фев 16, 16:00    [18804831]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
различил и что дальше?

В программном коде различили или в голове ?
11 фев 16, 16:01    [18804835]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Владислав Колосов
Winnipuh,

с каким сообщением ошибка?


Типа такого:

Duplicate key was ignored.
"	ATL::CStringT<wchar_t,ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
&#135;		ATL::CStringT<wchar_t,ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::operator= returned	"Duplicate key was ignored.
"	ATL::CStringT<wchar_t,ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > &
		hr	DB_E_INTEGRITYVIOLATION	HRESULT
11 фев 16, 16:01    [18804837]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Adx
Guest
В чем проблема сгенерировать уникальную строку и сделать ее именем constraint?
11 фев 16, 16:06    [18804870]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
o-o
Guest
Adx
В чем проблема сгенерировать уникальную строку и сделать ее именем constraint?

да проехали давно уже создание констрейнта,
он давно создан и пашет.
а выдает он Winnipuh-у ворнинг на дубли,
не еррор, а ворнинг, но это валит его клиентский код
11 фев 16, 16:46    [18805072]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
таблицу и к ней
Guest
Winnipuh
Если в процедуре сделать временную таблицу, в ней такой

CONSTRAINT [UQ_idk] UNIQUE NONCLUSTERED 
([pk] ASC) WITH (IGNORE_DUP_KEY = ON)
)



имеем следующее:

1. при запуске процедуры руками в SSMS - все работает, выдается одно безобидное сообщение
Duplicate key was ignored

, но возвращается рекордсет, всё ок.

2. при вызове этой же процедуры из приложения через ОЛЕДБ получаем ошибку вызова и как следствие пустой рекордсет

Я так понимаю проигнорировать или задавить это сообщение, а по сути генерацию ошибки после завершения в процедуре не получится?

а нужен именно констрейнт уникальности? и именно с дублями? прям вот чтоб уникальности и чтоб с дублями - конкретно вот это нужно, да?
11 фев 16, 17:00    [18805147]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
различил и что дальше?

В программном коде различили или в голове ?


иногда трудно понять ваш уход за пределы реальности
11 фев 16, 17:08    [18805191]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
иногда трудно понять ваш уход за пределы реальности

Руки надо выпрямлять при программировании.
Так понятнее ?
11 фев 16, 17:09    [18805196]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
таблицу и к ней
Winnipuh
Если в процедуре сделать временную таблицу, в ней такой

CONSTRAINT [UQ_idk] UNIQUE NONCLUSTERED 
([pk] ASC) WITH (IGNORE_DUP_KEY = ON)
)



имеем следующее:

1. при запуске процедуры руками в SSMS - все работает, выдается одно безобидное сообщение
Duplicate key was ignored

, но возвращается рекордсет, всё ок.

2. при вызове этой же процедуры из приложения через ОЛЕДБ получаем ошибку вызова и как следствие пустой рекордсет

Я так понимаю проигнорировать или задавить это сообщение, а по сути генерацию ошибки после завершения в процедуре не получится?

а нужен именно констрейнт уникальности? и именно с дублями? прям вот чтоб уникальности и чтоб с дублями - конкретно вот это нужно, да?



хороший вопрос, правда, излишек слов паразитов, но к сути:

во временную таблицу в процедуре вставляются записи несколькими частями, затем она джойнится с реальнйо таблицей и т.д. хотелось бы ускорить этот процесс.
Сейчас я добавляю все записи, включая дубликаты, но нужен индекс для джойна. Вот и подумалось, что возможно сервер будет отсеивать дубликаты, если сделать такой констрэйнт.
11 фев 16, 17:13    [18805219]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
иногда трудно понять ваш уход за пределы реальности

Руки надо выпрямлять при программировании.
Так понятнее ?


естественно , я согласен с этим, общие фразы всегда кажутся более понятными и бесспорными
11 фев 16, 17:14    [18805224]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Winnipuh
во временную таблицу в процедуре вставляются записи несколькими частями, затем она джойнится с реальнйо таблицей и т.д. хотелось бы ускорить этот процесс.
Сейчас я добавляю все записи, включая дубликаты, но нужен индекс для джойна. Вот и подумалось, что возможно сервер будет отсеивать дубликаты, если сделать такой констрэйнт.

Слу - просто не ставляй дубликаты и всех делов
11 фев 16, 17:19    [18805248]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8577
Странно, что драйвер сообщения с важностью 10 воспринимает как критические.
11 фев 16, 17:57    [18805422]     Ответить | Цитировать Сообщить модератору
 Re: Как создать constraint для временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
естественно , я согласен с этим, общие фразы всегда кажутся более понятными и бесспорными

Ну так выпримяте их уже
Научитесь _обрабатывать_ поступающие от сервера сообщения.
11 фев 16, 18:15    [18805495]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить