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

Откуда:
Сообщений: 6
Здравствуйте! Ситуация такая: есть таблица с заказами, назовем table1. Включает ID и еще некоторые поля, не важно. Есть таблица, сопоставляющая ID товаров и заказов, назовем table2 (поля: ID, OrderID, ProductID). Требуется написать хранимую процедуру, добавляющую заказ в table1 и заполняющую список товаров в table2. С добавлением заказа все просто. А вот со второй частью есть небольшие траблы. Я решил реализовать через функцию iter_intlist_to_table. Возвращаемая данной функцией таблица состоит их двух полей. number - это значение элемента списка, а listpos - это порядковый номер элемента в списке. Взял тут
https://www.sql.ru/articles/mssql/03060701arraysandlistsinsqlserver.shtml#iterative
Текущий индекс заказа получаю через IDENT_CURRENT. По идее мне нужно декартово произведение этого числа на столбец с number затолкнуть в insert. Пытаюсь так:
CREATE PROCEDURE AddOrder
@ClientId int,
@Sum float,
@Date date,
@ProductIds varchar(50)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO table1 (Client, Total_Sum, Date) VALUES (@ClientId, @Sum, @Date);
INSERT INTO table2 (OrderId, ProductId)
SELECT * FROM
IDENT_CURRENT ('table1') AS OrderId CROSS JOIN
(SELECT number FROM iter_intlist_to_table (@ProductIds))
END
GO



1. Где-то ошибочка.)))
2. IDENT_CURRENT ('table1') - это скаляр, а мне вроде нужен столбец. Правильно понимаю? Как преобразовать?
3. Помогите, пожалуйста, составить правильный запрос.
4. Я новичок, не смешивайте с грязью! =)
17 дек 13, 00:57    [15302259]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
leJeck,

А зачем скаляр пихать во FROM?

SELECT SCOPE_IDENTITY() AS OrderId, number as ProductId
FROM iter_intlist_to_table (@ProductIds))


а еще, вас что совсем не смущает, что IDENT_CURRENT - Returns the last identity value generated for a specified table or view. The last identity value generated can be for any session and any scope.
17 дек 13, 01:30    [15302315]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
leJeck
Member

Откуда:
Сообщений: 6
Mind
leJeck,

А зачем скаляр пихать во FROM?

SELECT SCOPE_IDENTITY() AS OrderId, number as ProductId
FROM iter_intlist_to_table (@ProductIds))



я пытаюсь сделать такую таблицу путем Cross Join:

значение number[0]
значение number[1]
значение number[2]
Значение number[3]

как-то так. И потом это пихнуть в INSERT. Я же вставляю не один товар в заказ, а несколько.

Mind
а еще, вас что совсем не смущает, что IDENT_CURRENT - Returns the last identity value generated for a specified table or view. The last identity value generated can be for any session and any scope.


ЭЭээ, может, я не правильно понял, но Returns the last identity value generated for a specified table or view меня вполне должно устраивать. Я получаю последний идентификатор указанной таблицы. Если юзать @@identity или SCOPE_IDENT, то они возвращают последние добавленные, что впринципе мне тоже подходит, но IDENT_CURRENT выглядит более "правильным". Если ошибаюсь, поправьте
17 дек 13, 11:09    [15303289]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
Ennor Tiegael
Member

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

Ну вот когда у вас заказы начнут одновременнно в 10-20 потоков вставляться, тогда может и поймете, что "правильно", а что надо было использовать.
17 дек 13, 11:17    [15303349]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
Glory
Member

Откуда:
Сообщений: 104760
leJeck
ЭЭээ, может, я не правильно понял, но Returns the last identity value generated for a specified table or view меня вполне должно устраивать.

А то, что это any session and any scope тоже устраивает ?

leJeck
Я получаю последний идентификатор указанной таблицы.

И вы уверенны, что это именно тот идетификатор, который вы добавили в своей сессии ?
17 дек 13, 11:18    [15303359]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
leJeck
Member

Откуда:
Сообщений: 6
Glory
leJeck
Я получаю последний идентификатор указанной таблицы.

И вы уверенны, что это именно тот идетификатор, который вы добавили в своей сессии ?

Не уверен, но судя по описанию - ПОСЛЕДНИЙ, значит ПОСЛЕДНИЙ. Я добавляю запись в таблицу и получаю ПОСЛЕДНИЙ идентификатор в этой таблице. Какая может быть проблема? Если кто-то уже сталкивался с этим на практике, и я ошибаюсь, поправьте =) И, кстати, оффтоп )) вопрос больше в CROSS JOIN. Я 100% неправильно написал запрос, помогите улучшить. Будем считать, что у нас индекс хранится в @index int-ового типа. индексы товаров в iter_intlist_to_table (@ProductIds) в столбце number.
17 дек 13, 12:51    [15304047]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
Glory
Member

Откуда:
Сообщений: 104760
leJeck
Не уверен, но судя по описанию - ПОСЛЕДНИЙ, значит ПОСЛЕДНИЙ.

Вы различате понятия "последний в таблице" и "последний, добавленный в моем соединении" ?

leJeck
Какая может быть проблема? Если кто-то уже сталкивался с этим на практике, и я ошибаюсь, поправьте =)

100 коннектов одновременно добавляют записи и потом читают ПОСЛЕДНИЙ ?

leJeck
И, кстати, оффтоп )) вопрос больше в CROSS JOIN. Я 100% неправильно написал запрос, помогите улучшить.

Уже улучшили. Путем отказа от CROSS JOIN
17 дек 13, 12:55    [15304083]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
leJeck
Member

Откуда:
Сообщений: 6
Glory
leJeck
Не уверен, но судя по описанию - ПОСЛЕДНИЙ, значит ПОСЛЕДНИЙ.

Вы различате понятия "последний в таблице" и "последний, добавленный в моем соединении" ?

leJeck
Какая может быть проблема? Если кто-то уже сталкивался с этим на практике, и я ошибаюсь, поправьте =)

100 коннектов одновременно добавляют записи и потом читают ПОСЛЕДНИЙ ?

leJeck
И, кстати, оффтоп )) вопрос больше в CROSS JOIN. Я 100% неправильно написал запрос, помогите улучшить.

Уже улучшили. Путем отказа от CROSS JOIN


Хорошо, лучше использовать SCOPE_IDENTITY()? Я не понимаю, почему все говорят о 100 коннектах одновременно... Но вам видней, я пока зеленый, прислушаюсь к вашему мнению. Но даже если использовать многопоточность, то как получится, что ОДНОВРЕМЕННО будут выполняться 2 разные транзакции SQL? Или может быть такое? Я думал, они все равно на sql server встанут в очередь)) Видимо, ошибался

Эмм.... ну отказались от CROSS JOIN, хотя не понял пока , чем он плох, отлично. Чем заменить? Мне надо получить таблицу вида

значение number[0]
значение number[1]
значение number[2]
Значение number[3]
17 дек 13, 13:08    [15304187]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
Glory
Member

Откуда:
Сообщений: 104760
leJeck
Но даже если использовать многопоточность, то как получится, что ОДНОВРЕМЕННО будут выполняться 2 разные транзакции SQL? Или может быть такое?

А где у вас добавление записи и чтение IDENT_CURRENT в _одной_ транзакции ??
У вас две команды - INSERT и SELECT, которые никак не влияют друг на друга

leJeck
Эмм.... ну отказались от CROSS JOIN, хотя не понял пока , чем он плох, отлично. Чем заменить? Мне надо получить таблицу вида

значение number[0]
значение number[1]
значение number[2]
Значение number[3]

Фейспалм какой-то

select 'значение', * from mytable
что непонятного в этом запросе ?
17 дек 13, 13:13    [15304239]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
leJeck
Member

Откуда:
Сообщений: 6
Glory, Вы, наверное невнимательно прочитали начало. Есть строка с индексами товаров, разделенными через пробел. типа '103 45 8'.
Мне надо создать строку заказа в одной таблице, и записать все эти индексы товары в другую, где берется индекс заказа и индекс товара. получится так. мы создали заказ, получили индекс. путь будет 15. тогда мне надо вставить
15 103
15 45
15 8
во вторую таблицу. Динамически создавать запросы не хочу, это не очень. вопрос в том, как мне сгенерить вот это
15 103
15 45
15 8
функция iter_intlist_to_table возвратит из '103 45 8' следующее:

index|number
0 | 103
1 | 45
2 | 85
17 дек 13, 13:51    [15304598]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
leJeck
Я новичок, не смешивайте с грязью! =)
Новичок читать по-русски умеет или нет? Тебе ответ дали во втором же посте.
17 дек 13, 21:14    [15307454]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
leJeck
Member

Откуда:
Сообщений: 6
Mind, я то умею. Посмотрите первый пост
leJeck
через функцию iter_intlist_to_table. Возвращаемая данной функцией таблица состоит их двух полей. number - это значение элемента списка, а listpos - это порядковый номер элемента в списке.

И что вернет запрос во втором посте?
Кстати, проблему решил, но через ж@пу. Пришлось создать функцию, возвращающую идентификатор как табличное значение. Тогда все работает как подразумевалось. Никто не знает другого способа преобразования? Если указывать SELECT ... AS ... CROSS JOIN... получаю синтаксическую ошибку.
18 дек 13, 16:33    [15312599]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
Glory
Member

Откуда:
Сообщений: 104760
leJeck
И что вернет запрос во втором посте?

Он вернет то, что вам нужно
18 дек 13, 20:38    [15313810]     Ответить | Цитировать Сообщить модератору
 Re: CROSS JOIN таблицы на скаляр.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
leJeck
Mind, я то умею. Посмотрите первый пост
leJeck
через функцию iter_intlist_to_table. Возвращаемая данной функцией таблица состоит их двух полей. number - это значение элемента списка, а listpos - это порядковый номер элемента в списке.
И что? Писать тоже желательно по-русски. Я лично не понимаю что именно не устраивает.
leJeck
Кстати, проблему решил, но через ж@пу.
Откуда руки такое и решение
18 дек 13, 21:00    [15313903]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить