[sql] GUID 용 SCOPE_IDENTITY ()?

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

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

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



답변

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 절 탐색


답변

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();
...


답변

NEWID ()를 사용하려는 경우

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

    select @id

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


답변

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;


답변

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

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;

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


답변