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

Откуда: Москва
Сообщений: 243
Добрый день!
Возник такой вопрос почему функция SCOPE_IDENTITY возвращает NULL если вставка идентификатора происходит в столбец с типом uniqueidentifier. Если объявить столбец как ID int identity ид возвращается

CREATE TABLE #users
(
ID uniqueidentifier DEFAULT NEWSEQUENTIALID()
,name varchar(50)
)
CREATE TABLE #phone
(
ID int identity(1,1)
,id_users varchar(36) NULL
,tel varchar(10) NULL
)
DECLARE @ID int
DECLARE @name varchar(10)='Тыц'
DECLARE @tel varchar(10)='123' 
begin TRANSACTION
INSERT INTO #users (name) VALUES (@name);
SET @ID=SCOPE_IDENTITY();
INSERT INTO #phone (id_users,tel) VALUES (@id,@tel);
COMMIT TRANSACTION;
GO


select * from #users
select * from #phone
drop table #phone
drop table #users



ID name
A840DDBA-0182-E411-B5FA-005056C00008 Тыц


ID id_users tel
1 NULL 123
12 дек 14, 16:22    [16989911]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
Glory
Member

Откуда:
Сообщений: 104751
BKV88
Возник такой вопрос почему функция SCOPE_IDENTITY возвращает NULL если вставка идентификатора происходит в столбец с типом uniqueidentifier. Если объявить столбец как ID int identity ид возвращается

Наверное потому, что вы не дочитали, что SCOPE_IDENTITY относится только identity
12 дек 14, 16:24    [16989927]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
BKV88
Добрый день!
Возник такой вопрос почему функция SCOPE_IDENTITY возвращает NULL если вставка идентификатора происходит в столбец с типом uniqueidentifier. Если объявить столбец как ID int identity ид возвращается

CREATE TABLE #users
(
ID uniqueidentifier DEFAULT NEWSEQUENTIALID()
,name varchar(50)
)
CREATE TABLE #phone
(
ID int identity(1,1)
,id_users varchar(36) NULL
,tel varchar(10) NULL
)
DECLARE @ID int
DECLARE @name varchar(10)='Тыц'
DECLARE @tel varchar(10)='123' 
begin TRANSACTION
INSERT INTO #users (name) VALUES (@name);
SET @ID=SCOPE_IDENTITY();
INSERT INTO #phone (id_users,tel) VALUES (@id,@tel);
COMMIT TRANSACTION;
GO


select * from #users
select * from #phone
drop table #phone
drop table #users




ID name
A840DDBA-0182-E411-B5FA-005056C00008 Тыц


ID id_users tel
1 NULL 123



а вы что ожидали там увидеть?
12 дек 14, 16:25    [16989930]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Наверное потому, что вы не дочитали, что SCOPE_IDENTITY относится только identity[/quot]

Какую функцию использовать, чтобы поймать вставленный ид в uniqueidentifier ?
12 дек 14, 16:27    [16989962]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
BKV88
Member

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

Ожидал идентификатор A840DDBA-0182-E411-B5FA-005056C00008
12 дек 14, 16:28    [16989967]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
output inserted.id
12 дек 14, 16:28    [16989968]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
так вам же и написанно что SCOPE_IDENTITY имеет возращаемый тип numeric(38,0) , да и не должна она реагировать на NEWSEQUENTIALID()
http://msdn.microsoft.com/en-us/library/ms190315(v=sql.105).aspx
12 дек 14, 16:28    [16989972]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
Axeleron
Member

Откуда: London
Сообщений: 7531
CREATE TABLE dbo.GuidPk (
    ColGuid uniqueidentifier NOT NULL DEFAULT NewSequentialID(),
    Col2    int              NOT NULL
)
GO

DECLARE @op TABLE (
    ColGuid uniqueidentifier
)

INSERT INTO dbo.GuidPk (
    Col2
)
OUTPUT inserted.ColGuid
INTO @op
VALUES (1)

SELECT * FROM @op

SELECT * FROM dbo.GuidPk
12 дек 14, 16:28    [16989977]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
Glory
Member

Откуда:
Сообщений: 104751
BKV88
Какую функцию использовать, чтобы поймать вставленный ид в uniqueidentifier ?

Никакую
Вы наверное не понимаете, что разницу между свойством поля(IDENTITY) и значением по умолчанию(DEFAULT)
12 дек 14, 16:30    [16989989]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
BKV88
Какую функцию использовать, чтобы поймать вставленный ид в uniqueidentifier ?

Никакую
Вы наверное не понимаете, что разницу между свойством поля(IDENTITY) и значением по умолчанию(DEFAULT)


Сделать, output inserted.id во временную таблицу как вам сказали уже выше, и сделать из временной таблицы SELECT.

Сделайте поле с DEAULT выражением NEWSEQUENTIALID ( ) и используйте его в качестве первичного ключа. Рекомендую именно NEWSEQUENTIALID ( ), а не NEWID() или что-то ещё.
12 дек 14, 17:11    [16990393]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Axeleron
CREATE TABLE dbo.GuidPk (
    ColGuid uniqueidentifier NOT NULL DEFAULT NewSequentialID(),
    Col2    int              NOT NULL
)
GO

DECLARE @op TABLE (
    ColGuid uniqueidentifier
)

INSERT INTO dbo.GuidPk (
    Col2
)
OUTPUT inserted.ColGuid
INTO @op
VALUES (1)

SELECT * FROM @op

SELECT * FROM dbo.GuidPk


Вот вполне нормальное решение
12 дек 14, 17:12    [16990407]     Ответить | Цитировать Сообщить модератору
 Re: uniqueidentifier & SCOPE_IDENTITY  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Вот так работает. Всем спасибо

CREATE TABLE #users
(
ID uniqueidentifier DEFAULT NEWSEQUENTIALID()
,name varchar(50)
)
CREATE TABLE #phone
(
ID uniqueidentifier DEFAULT NEWSEQUENTIALID()
,id_users varchar(36) NULL
,tel varchar(10) NULL
)
DECLARE @ID varchar(36)
DECLARE @name varchar(10)='Тыц'
DECLARE @tel varchar(10)='123' 

DECLARE @guid TABLE (Guid uniqueidentifier)

begin TRANSACTION
INSERT INTO #users (name) 
OUTPUT inserted.id 
INTO @GUID
VALUES (@name);

set @id=(select guid from @guid)

INSERT INTO #phone (id_users,tel) VALUES (@id,@tel);
COMMIT TRANSACTION;
GO


select * from #users
select * from #phone
drop table #phone
drop table #users
12 дек 14, 17:50    [16990705]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить