Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
скажем, есть таблица:
t(id int primary key identity (1,1), id_text varchar(50))
в ней два поля: идентификатор и текстовое значение идентификатора.

можно ли как-то вставить туда запись в один инсерт?

или только сначала инсерт с каким-либо другим id_text, потом scope_idenity() и апдейт?
24 май 13, 12:52    [14344349]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
Glory
Member

Откуда:
Сообщений: 104751
текстовое значение
или только сначала инсерт с каким-либо другим id_text, потом scope_idenity() и апдейт?

А что вы собираетесь дальше делать с этим id_text ?
24 май 13, 12:54    [14344378]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
уточнить

вот так правильнее: t(id int primary key identity (1,1), id_text varchar(50) NOT NULL)
24 май 13, 12:54    [14344385]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
Glory,

скажем есть таблица заказов, там есть номер заказа, задача - добавить новый заказ, и если номер не задан, то ему присвоить значение id.
24 май 13, 12:57    [14344418]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
Glory
Member

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

Еще раз вопрос - "что вы собираетесь дальше делать с этим id_text ?"
Не что должно произойти при insert, а дальше, потом, после...
24 май 13, 12:59    [14344440]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
Glory,

ничего. вставили и закончили.
24 май 13, 13:01    [14344472]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
Glory
Member

Откуда:
Сообщений: 104751
текстовое значение
ничего. вставили и закончили.

Тогда сделайте id_text вычисляемым полем
24 май 13, 13:02    [14344486]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
Glory,

нет, не получится.
примерная ситуация:
есть таблица заказов Orders(OrderID int primary key identity (1,1), OrderNo varchar(50) not null, ...)
пользователи какой хотят, такой и задают OrderNo.
мне надо одним чохом залить в Orders набор строк, причем OrderNo = convert(varchar, OrderID) и успокоиться.
24 май 13, 13:07    [14344547]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
текстовое значение
Glory,

нет, не получится.
примерная ситуация:
есть таблица заказов Orders(OrderID int primary key identity (1,1), OrderNo varchar(50) not null, ...)
пользователи какой хотят, такой и задают OrderNo.
мне надо одним чохом залить в Orders набор строк, причем OrderNo = convert(varchar, OrderID) и успокоиться.
не набор - одну
24 май 13, 13:11    [14344593]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Вроде бы в этом текстовом поле нет никакого смысла, получается.
Нумерация документов - это отдельная большая задача.
Вот, например, решение: Организация пользовательских счетчиков (генераторов) в Microsoft SQL Server
24 май 13, 13:14    [14344620]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
Glory
Member

Откуда:
Сообщений: 104751
текстовое значение
нет, не получится.
примерная ситуация:
есть таблица заказов Orders(OrderID int primary key identity (1,1), OrderNo varchar(50) not null, ...)
пользователи какой хотят, такой и задают OrderNo.
мне надо одним чохом залить в Orders набор строк, причем OrderNo = convert(varchar, OrderID) и успокоиться.

И что ? Какая разница для OrderNo, как сформировалось значение OrderID - сервером или было указано явно ?
24 май 13, 13:14    [14344628]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
ребята, можете ответить на первый вопрос?
24 май 13, 13:15    [14344632]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
ну пусть вместо id_text при чтении из этой таблицы выбирается isnull(id_text, cast(id as varchar(50)) как-то так
24 май 13, 13:16    [14344643]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
Glory,

большая. в одном случае я при заведении заказа должен иметь возможность указать Номер заказа = 'ТрамПаПам20012'.
в другом нужно, чтобы Номер заказа = айди записи, строго обязательно.
24 май 13, 13:17    [14344657]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
текстовое значение
ребята, можете ответить на первый вопрос?
да, update
24 май 13, 13:18    [14344662]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
текстовое значение
Guest
Паганель
текстовое значение
ребята, можете ответить на первый вопрос?
да, update
ок, спасибо

я не архитекор системы, делаю как просят
24 май 13, 13:19    [14344675]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А в случае SQL2012 можно и SEQUENCE применить
24 май 13, 13:22    [14344698]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
kinglion
Member

Откуда:
Сообщений: 16
текстовое значение,

DECLARE @t TABLE (id int identity(1, 1) PRIMARY KEY CLUSTERED, id_text varchar(50) NOT NULL)
SELECT * FROM @t
INSERT INTO @t (id_text) VALUES ('num1')

Варианты получения только что вставленного id
SELECT SCOPE_IDENTITY() AS id
SELECT TOP(1) id FROM @t WHERE id_text = 'num1'
SELECT TOP(1) id FROM @t ORDER BY id DESC
24 май 13, 18:26    [14347021]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kinglion
Варианты получения только что вставленного id
SELECT TOP(1) id FROM @t WHERE id_text = 'num1'

Вариант неправильный:
DECLARE @t TABLE (id int identity(1, 1) PRIMARY KEY CLUSTERED, id_text varchar(50) NOT NULL)
INSERT INTO @t (id_text) VALUES ('num1')
INSERT INTO @t (id_text) VALUES ('num1')
SELECT TOP(1) id FROM @t WHERE id_text = 'num1'
/* Только что был вставлен id = 2, запрос вернул id=1
id
-----------
1
*/

kinglion
SELECT TOP(1) id FROM @t ORDER BY id DESC

Вариант подходит только для табличных переменных или для временных таблиц. При вставке в постоянную таблицу между insert'ом и таким вот select'ом может вклиниться параллельный процесс, и тогда select прочитает значение id из другого процесса.

kinglion
SELECT SCOPE_IDENTITY() AS id

Это рабочий вариант, с ограничениями -- подходит для единичных вставок в таблицу, на которой нет instead of триггеров.
24 май 13, 23:41    [14348109]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
kinglion
Member

Откуда:
Сообщений: 16
Гость333,

Благодарю!

Вы помогли осветить в этой теме плючы и минусы перечисленных вариантов получения id
27 май 13, 15:04    [14354521]     Ответить | Цитировать Сообщить модератору
 Re: текстовое значение идентификатора при вставке  [new]
kinglion
Member

Откуда:
Сообщений: 16
Гость333,

Еще один вариант
INSERT INTO @t (id_text) OUTPUT INSERTED.id VALUES ('num1')
27 май 13, 15:05    [14354531]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить