SQL Server - INSERT 후 값 반환
INSERT 스테이트먼트 후에 키 값을 돌려받으려고 합니다.예:속성 이름과 ID가 적힌 테이블이 있어요id는 생성된 값입니다.
INSERT INTO table (name) VALUES('bob');
이제 같은 순서로 ID를 돌려받도록 하겠습니다.이거 어떻게 하는 거야?
Microsoft SQL Server 2008을 사용하고 있습니다.
별도의 SELECT가 필요 없습니다...
INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');
이는 IDENTY가 아닌 열(GUID 등)에도 적용됩니다.
SCOPE_IDENTITY()
INSERT INTO table (name) VALUES('bob');
SELECT SCOPE_IDENTITY()
http://msdn.microsoft.com/en-us/library/ms190315.aspx
INSERT INTO files (title) VALUES ('whatever');
SELECT * FROM files WHERE id = SCOPE_IDENTITY();
트리거가 있는 테이블에서 OUTPUT 절 충돌에 대해 알려진 문제가 있으므로 가장 안전한 방법입니다.테이블에 현재 트리거가 없는 경우에도 신뢰할 수 없는 상태가 됩니다.아래 행에 트리거를 추가하면 어플리케이션이 망가집니다.시한폭탄 같은 거.
상세한 것에 대하여는, 다음의 msdn 기사를 참조해 주세요.
엔티티 프레임워크는 gbn의 답변과 유사한 작업을 수행합니다.
DECLARE @generated_keys table([Id] uniqueidentifier)
INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');
SELECT t.[CustomerID]
FROM @generated_keys AS g
JOIN dbo.Customers AS t
ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0
출력 결과는 임시 테이블 변수에 저장된 후 클라이언트에 다시 선택됩니다.gotcha를 인식해야 합니다.
할 수 할 수 여러 할 수 .
ID
EF가 ephemeral 테이블을 실제 테이블로 되돌리는 이유를 알 수 없습니다(어떤 상황에서 두 테이블이 일치하지 않는지).
하지만 그게 EF가 하는 일입니다.
SQL Server 2008 이후만.2005년이면 넌 운이 없는 거야.
삽입 후 종료하는 방법은 여러 가지가 있습니다.
테이블에 데이터를 삽입할 때 OUTPUT 절을 사용하여 테이블에 삽입된 데이터의 복사본을 반환할 수 있습니다.OUTPUT 구에는 OUTPUT과 OUTPUT INTO의 두 가지 기본 형식이 있습니다.발신측 애플리케이션에 데이터를 되돌리는 경우는, OUTPUT 폼을 사용합니다.데이터를 테이블 또는 테이블 변수로 되돌리려면 OUTPUT INTO 양식을 사용하십시오.
DECLARE @MyTableVar TABLE (id INT,NAME NVARCHAR(50));
INSERT INTO tableName
(
NAME,....
)OUTPUT INSERTED.id,INSERTED.Name INTO @MyTableVar
VALUES
(
'test',...
)
IDENT_CURRENT: 세션에서 특정 테이블 또는 뷰에 대해 마지막으로 생성된 ID를 반환합니다.
SELECT IDENT_CURRENT('tableName') AS [IDENT_CURRENT]
SCOPE_IDENTY: 동일한 세션 및 동일한 범위에서 마지막 ID를 반환합니다.스코프는 저장 프로시저/트리거 등입니다.
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
@@IDENTY: 같은 세션에서 마지막 ID를 반환합니다.
SELECT @@IDENTITY AS [@@IDENTITY];
@@IDENTITY마지막으로 삽입된 ID 값을 반환하는 시스템 함수입니다.
insert 명령어 뒤에 마지막으로 삽입된 ID를 얻는 방법은 여러 가지가 있습니다.
@@IDENTITY: 현재 세션의 Connection에서 생성된 마지막 ID 값을 테이블 및 값을 생성한 문 범위에 관계없이 반환합니다.SCOPE_IDENTITY(): 테이블에 관계없이 현재 연결의 현재 범위에서 insert 문에 의해 생성된 마지막 ID 값을 반환합니다.IDENT_CURRENT(‘TABLENAME’): 연결, 세션 또는 범위에 관계없이 지정된 테이블에서 마지막으로 생성된 ID 값을 반환합니다.IDENT_CURRENT는 범위 및 세션에 의해 제한되지 않으며 지정된 테이블로 제한됩니다.
이제 어떤 것이 제 요구 사항에 정확히 일치할지를 결정하는 것이 더 어려워 보입니다.
주로 SCOPE_IDENTITY()를 선호합니다.
select SCOPE_IDENTITY()를 insert 스테이트먼트에서 TableName과 함께 사용하면 예상대로 정확한 결과를 얻을 수 있습니다.
출처 : CodoBee.
사용하고 있는 가장 확실한 솔루션SCOPE_IDENTITY().
같은 스코프에서 2개의 삽입을 호출할 수 있기 때문에 삽입할 때마다 스코프 ID를 취득하여 변수에 저장하기만 하면 됩니다.
ident_current그리고.@@identity효과가 있을 수 있지만 안전한 범위는 아닙니다.큰 어플리케이션에서는 문제가 발생할 수 있습니다.
declare @duplicataId int
select @duplicataId = (SELECT SCOPE_IDENTITY())
상세한 것에 대하여는, Microsoft 의 문서를 참조해 주세요.
사용할 수 있습니다.scope_identity()변수에 방금 삽입한 행의 ID를 선택한 다음 해당 표에서 원하는 열을 선택합니다(ID = ID).scope_identity()
MSDN 의 정보에 대해서는, 여기를 참조해 주세요.http://msdn.microsoft.com/en-us/library/ms190315.aspx
새 ID 값을 가져오려면 SCOPE_IDENTITY()를 사용하는 것이 좋습니다. 단, "OUTPUT Inserted"는 사용하지 마십시오.아이디"
insert 스테이트먼트에서 예외가 발생하면 직접 던지는 경우를 제외하고는 예외입니다.하지만 "OUTPUT INSERTED.ID"는 0을 반환하지만 예상과는 다를 수 있습니다.
SQL Server에서 ID 열로 ID를 사용하는 테이블에 삽입할 때 OUTPUT INSERTED를 사용하는 방법은 다음과 같습니다.
'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)
select 문을 삽입문에 추가할 수 있습니다.Integer myInt = 테이블 1(FName) 값에 삽입('Fred'); Scope_Identity()를 선택합니다. 그러면 스케일러가 실행될 때 ID 값이 반환됩니다.
* 접속 문자열의 파라미터 순서가 중요할 수 있습니다. * 행 추가 후 공급자 파라미터의 위치에 따라 레코드 집합 커서가 끊어질 수 있습니다.이 동작은 SQLOLEDB 프로바이더에서 확인되었습니다.
행을 추가하면 연결 문자열의 첫 번째 매개 변수로 공급자가 지정되지 않는 한 행 필드를 사용할 수 없습니다.공급자가 첫 번째 파라미터 이외의 접속 문자열 내에 있는 경우 새로 삽입된 행 필드는 사용할 수 없습니다.공급자를 첫 번째 매개 변수로 이동하면 행 필드가 마법처럼 나타납니다.
ID 컬럼을 사용하여 테이블에 삽입한 후 @@IDENTITY를 참조하여 다음 값을 얻을 수 있습니다.http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
언급URL : https://stackoverflow.com/questions/7917695/sql-server-return-value-after-insert
'programing' 카테고리의 다른 글
| SQL Server 로그인이 이미 있는지 확인하는 중 (0) | 2023.04.06 |
|---|---|
| Tablix: 각 페이지의 헤더 행을 반복합니다(Report Builder 3.0). (0) | 2023.04.06 |
| 클래스의 모든 속성을 루프하려면 어떻게 해야 합니까? (0) | 2023.04.06 |
| T-SQL 선택에서 각 행에 대해 난수를 생성하려면 어떻게 해야 합니까? (0) | 2023.04.06 |
| Wordpress wp-config.php doesn't update in Dockers? (0) | 2023.04.01 |