답변:
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
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;
다른 사람이 같은 일을하는 데 도움이 될 수 있습니다. 이것이 좋은 생각이 아니거나 그렇지 않은 경우 성능 현명한 말을 할 사람이 있는지 궁금합니다.