GUID 용 SCOPE_IDENTITY ()?


94

누구든지 동등한 것이 있는지 말해 줄 수 있습니까? SCOPE_IDENTITY()SQL Server에서 GUID를 기본 키로 사용할 때 ?

순차 GUID를 기본 키로 사용하므로 먼저 GUID를 만들고 변수로 저장하고 싶지 않습니다.

마지막으로 삽입 된 GUID 기본 키를 검색하는 가장 좋은 방법에 대한 아이디어가 있습니까?

답변:


98

OUTPUT을 사용하여 GUID를 다시 가져올 수 있습니다. 여러 레코드를 삽입 할 때도 작동합니다.

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

참조 : SQL 2005의 OUTPUT 절 탐색


2
anishmarokey가 언급했듯이 NewID ()가 아닌 NewSequentialID ()를 사용하여 GUID를 생성해야합니다.
Rob Garrison

@RobGarrison Imo, PK로서의 GUID는 분산 시스템에서 int / bigint보다 실제로 유리합니다. ID를 가져 오기 위해 DB를 치는 경우 int / bigint를 사용하는 것이 좋습니다. NewSequentialID ()는 기본 제약으로 만 사용할 수 있습니다 (예를 들어 NewSequentialID ()를 사용하여 명시 적으로 삽입 할 수 없음). 따라서 나는 당신이 그것을 사용할 있는 대부분의 시나리오는 어쨌든 일을 다르게해야한다고 생각합니다.
Shiv

OUTPUT절은 삽입 트리거가 첨부 된 테이블에 오류를 제공합니다.
Cobus Kruger

60

GUID를 기본 키로 사용하는 경우 SCOPE_IDENTITY ()에 해당하는 것은 없지만 OUTPUT 절을 사용하여 비슷한 결과를 얻을 수 있습니다. 출력을 위해 테이블 ​​변수를 사용할 필요가 없습니다.

CREATE TABLE dbo.GuidTest (
    GuidColumn uniqueidentifier NOT NULL DEFAULT NewSequentialID(),
    IntColumn int NOT NULL
)

GO

INSERT INTO GuidTest(IntColumn)
OUTPUT inserted.GuidColumn
VALUES(1)

위의 예는 .Net 클라이언트에서 값을 읽으려는 경우 유용합니다. .Net에서 값을 읽으려면 ExecuteScalar 메서드를 사용하면됩니다.

...
string sql = "INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)";
SqlCommand cmd = new SqlCommand(sql, conn);
Guid guid = (Guid)cmd.ExecuteScalar();
...

9

NEWID ()를 사용하려는 경우

    declare @id uniqueidentifier
    set @id  = NEWID()
    INSERT INTO [dbo].[tbl1]
           ([id])
     VALUES
           (@id)

    select @id

그러나 클러스터 된 인덱스 문제가 GUID에 있습니다. 이것도 읽어 보세요 NEWSEQUENTIALID () . 이것들 은 내 생각입니다, GUID를 기본 키로 사용하기 전에 생각하십시오 . :)


10
"newsequentialid () 내장 함수는 CREATE TABLE 또는 ALTER TABLE 문에서 'uniqueidentifier'유형의 열에 대한 DEFAULT 표현식에서만 사용할 수 있습니다. 다른 연산자와 결합하여 복잡한 스칼라 표현식을 형성 할 수 없습니다."
Scott Whitlock

4
CREATE TABLE TestTable(KEY uniqueidentifier, ID VARCHAR(100), Name VARCHAR(100), Value tinyint);
Declare @id uniqueidentifier ;  
DECLARE @TmpTable TABLE (KEY uniqueidentifier);     
INSERT INTO [dbo].[TestTable]
    ([ID], [Name], Value])           
    OUTPUT INSERTED.KEY INTO @TmpTable           
    VALUES(@ID, @Name, @Value);           
SELECT @uniqueidentifier = KEY FROM @TmpTable; 
DROP TABLE TestTable;

2

이 스레드를 리소스로 사용하여 트리거 내에서 사용하기 위해 다음을 만들었습니다.

DECLARE @nextId uniqueIdentifier;
DECLARE @tempTable TABLE(theKey uniqueIdentifier NOT NULL DEFAULT NewSequentialID(), b int);
INSERT INTO @tempTable (b) Values(@b);
SELECT @nextId = theKey from @tempTable;

다른 사람이 같은 일을하는 데 도움이 될 수 있습니다. 이것이 좋은 생각이 아니거나 그렇지 않은 경우 성능 현명한 말을 할 사람이 있는지 궁금합니다.


질문을 다시 읽은 후 이것이 실제로 사용자 질문에 대한 답변이 아니라는 것을 깨달았지만 유사한 답변이 동일한 유형의 응답이기 때문에 누군가에게 여전히 도움이 될 수 있습니다.
TravisWhidden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.