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

Откуда:
Сообщений: 19
Добрый всем вечер!
я заливаю из xml данные в db2.tabel1 а они по не доступному мне механизму заливаются в db1.tabel1
но только в том случаи если поле db2.tabel1.BO_Code не будет присутствовать в db1.tabel1.BO_Code

Помогите собрать схему при которой каждый раз при заполнении таблицы db2.tabel1 поле BO_Code автоматом проставлялось по счетчику начиная от последнего значения из db1.tabel1.BO_Code?

Каждый раз при импорте я очищаю промежуточную таблицу и могу запросить последнее значение из db1.tabel1.BO_Code + 1 но как вставить эту информацию в конструкцию insert не знаю (
declare @BO_ID varchar(max)
Set @BO_ID = (convert(varchar(8),(select top 1 BOCode from [db1].[dbo].[tabel1] order by created_date desc),112)) + 1

delete from [db2].[tabel1]
insert into [db2].[tabel1]
pole1
,pole2
,pole3
BO_Code
select
11 as pole1
,22 as pole2
,33 as pole3
,@BO_ID as BO_Code

from #Table


Не работает т.к. во временной таблице #Table не одна запись а много(
30 сен 16, 18:37    [19730284]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
aleks2
Guest
declare @BO_ID int
Set @BO_ID = (select max(BOCode) from [db1].[dbo].[tabel1]);

delete from [db2].[tabel1]
insert into [db2].[tabel1]
pole1
,pole2
,pole3
BO_Code
select
11 as pole1
,22 as pole2
,33 as pole3
,@BO_ID + row_number() over(order by 1/0) as BO_Code
from #Table
1 окт 16, 19:02    [19732863]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
hks-msk
Member

Откуда:
Сообщений: 19
Спасибо, сейчас попробую.
3 окт 16, 10:15    [19736313]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
uaggster
Member

Откуда:
Сообщений: 1058
aleks2
row_number() over(order by 1/0) as BO_Code

aleks2, поделитесь, пожалуйста, почему так работает?
И почему это лучше, чем row_number() over(order by (select Null) ) ?
3 окт 16, 10:55    [19736467]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
uaggster
aleks2
row_number() over(order by 1/0) as BO_Code

aleks2, поделитесь, пожалуйста, почему так работает?
И почему это лучше, чем row_number() over(order by (select Null) ) ?

писать меньше
3 окт 16, 10:57    [19736477]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
uaggster
Member

Откуда:
Сообщений: 1058
TaPaK, да это я понял. Кроме того - на одну операцию в плане меньше.

Я не могу понять, почему так ВООБЩЕ работает!
Как это звучит в переводе на человеческий.
3 окт 16, 11:00    [19736485]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
uaggster
Как это звучит в переводе на человеческий.
"А чёрт его знает!" :))
3 окт 16, 11:48    [19736677]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
uaggster,

19573290
3 окт 16, 12:12    [19736801]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
uaggster
TaPaK, да это я понял. Кроме того - на одну операцию в плане меньше.

Я не могу понять, почему так ВООБЩЕ работает!
Как это звучит в переводе на человеческий.


Добрый день. Согласно документации, в предложении OVER допустимы:
автор
order_by_expression
Указывает столбец или выражение, по которому производится сортировка. Аргумент order_by_expression может ссылаться только на столбцы, сделанные доступными с помощью предложения FROM. Нельзя указывать целое число для обозначения имени или псевдонима столбца.

Формально, выражение 1/0 выражение, но если вы напишете вместо 1/0, например, 1/2, вы получите:
select rn = row_number() over(order by 1/0) from master..spt_values;
-- ОК

select rn = row_number() over(order by 1/2) from master..spt_values;
-- Windowed functions and NEXT VALUE FOR functions do not support constants as ORDER BY clause expressions.

Хотя и там и там константы. Дело тут в процессе, который предшествует оптимизации и называется Constant Folding (проще говоря - сворачивание констант):
автор
SQL Server evaluates some constant expressions early to improve query performance. This is referred to as constant folding.

Можно почитать по ссылке, какие выражения могут быть свернуты а какие нет. К сожалению, там нет выражения 1/0 как исключительного случая, но дело в том, что такое выражение он не может свернуть на этапе компиляции, а на этапе оптимизации, это выражение просто выбрасывается, т.к. бессмысленно сортировать по константе.

Если отключить правило выкидывающее сортировку по 1/0, то вы получите план, но на этапе выполнения будет ошибка деления на ноль:
select rn = row_number() over(order by 1/0) from master..spt_values option(queryruleoff NormalizeSequenceProject);
-- Divide by zero error encountered.

По причине же сворачивания констант работает и нет, например, такое:
select rn = row_number() over(order by convert(varchar(100),0)) from master..spt_values;
-- Windowed functions and NEXT VALUE FOR functions do not support constants as ORDER BY clause expressions.

select rn = row_number() over(order by convert(varchar(max),0)) from master..spt_values;
-- OK

Лично мне не влом писать order by (select null), формально как-то более правильно, да и просто привычка уже =)
3 окт 16, 13:09    [19737104]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
SomewhereSomehow,

Лично мне не влом писать order by (select null), формально как-то более правильно, да и просто привычка уже =)

то что правильнее тут вопросов нет, вопрос что на этот счёт считает ms.. если они считают это багой и в результате исправят то это одно :) если фичей то и ладно
3 окт 16, 13:12    [19737132]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
По-моему, (SELECT NULL) - это такой же жульнический приём, как и 1/0
Если уж исправлять в соответствии с принципами, то надо запретить и то, и другое.
3 окт 16, 13:28    [19737219]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
По-моему, (SELECT NULL) - это такой же жульнический приём, как и 1/0
Если уж исправлять в соответствии с принципами, то надо запретить и то, и другое.

или расширить на константы
3 окт 16, 13:32    [19737250]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
TaPaK
iap
По-моему, (SELECT NULL) - это такой же жульнический приём, как и 1/0
Если уж исправлять в соответствии с принципами, то надо запретить и то, и другое.

или расширить на константы
Или разрешить не посать ORDER BY в OVER(), когда порядок не нужен
3 окт 16, 13:35    [19737267]     Ответить | Цитировать Сообщить модератору
 Re: Insert в поле Identity  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
TaPaK
пропущено...

или расширить на константы
Или разрешить не поисать ORDER BY в OVER(), когда порядок не нужен
3 окт 16, 13:35    [19737272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить