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

Откуда:
Сообщений: 7
День Добрый!

Есть таблица:
CREATE  TABLE  table ( 
 _key1 INT NOT NULL,
 _key2 INT NOT NULL 
 PRIMARY KEY(_key1, _key2)
);


Есть необходимость одной транзакцией записывать множество значений приходящих с _key2, c увеличением соответствующего поля _ke1. Что-то вроде:
INSERT INTO VALUES
   ( <выражение для получения следующего _key1 соответствующего данному _key2> , _key2 ) ,
   ( <выражение для получения следующего _key1 соответствующего данному _key2> , _key2 ) ,
   ( <выражение для получения следующего _key1 соответствующего данному _key2> , _key2 ) ,
   .......


пробовал делать(Count и Мах) :
SELECT ISNULL((SELECT Count(_key1) 
			FROM table
			WHERE _key2 = key2_value),0)) +1

Но вставляет одно и то же значение _key1.
Подскажите что можно записать в это выражение
1 фев 12, 10:23    [12009163]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
aleks2
Guest
откройте для себя ROW_NUMBER()
1 фев 12, 10:30    [12009203]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
MAX()OVER()+ROW_NUMBER()OVER()
Но если это будут делать несколько клиентов одновременно,
могут быть неприятные последствия.
Смотреть "уровни изоляции транзакции".
1 фев 12, 10:30    [12009206]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
vinil_spb
Member

Откуда:
Сообщений: 7
iap
MAX()OVER()+ROW_NUMBER()OVER()

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


Клиент у меня один, тут повезло. А можно немного поподробней, в плане синтаксиса использования, в рамках примера?
на сколько я понимаю надо сделать так:
SELECT ISNULL((SELECT MAX(_key1) FROM table WHERE _key2 = key2_value),0)) 
 +ROW_NUMBER() OVER( partition by _key2 ORDER BY _key1 DESC) 
1 фев 12, 11:11    [12009483]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SELECT ISNULL(MAX(_key1)OVER(PARTITION BY _key2),0)+ROW_NUMBER()OVER(PARTITION BY _key2 ORDER BY _key1)
FROM ...;
Не понял, почему у Вас DESC?
1 фев 12, 11:19    [12009530]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
vinil_spb
Member

Откуда:
Сообщений: 7
iap,
C DESC просто не усмотрел.

MAX()OVER()

при пустой таблице возвращает пустую колонку, в отличие от МАХ(), которая возвращает NULL, что напрочь портит всю красоту картины...
1 фев 12, 11:51    [12009851]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
vinil_spb
iap,
C DESC просто не усмотрел.

MAX()OVER()

при пустой таблице возвращает пустую колонку, в отличие от МАХ(), которая возвращает NULL, что напрочь портит всю красоту картины...
Что такое "пустая колонка"?
Какое значение имеет в ней поле запроса?
1 фев 12, 11:56    [12009886]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Хотя, да! Я неправ!
Это же будет MAX по полю в SELECTе, а нужен среди записей таблицы до вставки.

Посыпаю голову пеплом
1 фев 12, 11:59    [12009909]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
vinil_spb
Member

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

SELECT MAX(_key1)OVER(PARTITION BY _key2) from table

возвращает пустую таблицу, с 1 колонкой, с которой ничего не сделать(с моим уровнем знания языка)
SELECT   MAX(_key1) from table

возвращает таблицу с 1 колонкой с 1 значением NULL, которое дальше можно переделать в число и с ним работать.

К сообщению приложен файл. Размер - 12Kb
1 фев 12, 12:07    [12009969]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация во множественном INSERT для полей без автоинкремента  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
vinil_spb
Есть необходимость одной транзакцией записывать множество значений приходящих с _key2, c увеличением соответствующего поля _ke1.

А что мешает поиспользовать временную таблицу с тем же инкрементом? А затем перелить в рабочую? Обрамив операции транзакцией.
1 фев 12, 16:17    [12012946]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить