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');
이것은 비 IDENTITY 열 (예 : GUID)에서도 작동합니다.
SCOPE_IDENTITY()
새로운 ID 값을 얻는 데 사용
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 기사를 참조하십시오.
Entity Framework는 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
출력 결과는 임시 테이블 변수에 저장된 후 클라이언트로 다시 선택됩니다. 문제를 알고 있어야합니다.
삽입은 둘 이상의 행을 생성 할 수 있으므로 변수가 둘 이상의 행을 보유 할 수 있으므로 둘 이상을 리턴 할 수 있습니다
ID
EF가 임시 테이블을 내부 테이블과 다시 결합하는 이유를 알 수 없습니다 (어떤 상황에서 두 가지가 일치하지 않을까요).
그러나 이것이 EF가하는 일입니다.
SQL Server 2008 이상 만 2005 년이면 운이 나쁘다.
@@IDENTITY
마지막으로 삽입 된 ID 값을 반환하는 시스템 함수입니다.
가장 확실한 솔루션은 SCOPE_IDENTITY()
입니다.
동일한 범위에서 두 개의 삽입을 호출 할 수 있으므로 모든 삽입 후 범위 ID를 가져와 변수에 저장해야합니다.
ident_current
그리고 @@identity
그들이 일을하지만 그들이 안전 범위 아니다. 큰 응용 프로그램에서 문제가 발생할 수 있습니다
declare @duplicataId int
select @duplicataId = (SELECT SCOPE_IDENTITY())
자세한 내용은 여기에 Microsoft 문서
당신은 사용 scope_identity()
후 바로 ID가 당신에게서 얻은 신원을 = 그 테이블에서 당신이 원하는대로 열을 선택 당신은 그냥 변수에 삽입 된 행의 ID를 선택scope_identity()
MSDN 정보는 여기를 참조하십시오 http://msdn.microsoft.com/en-us/library/ms190315.aspx
이것은 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 문을 추가 할 수 있습니다. 정수 myInt = table1 (FName) 값에 삽입 ( 'Fred'); Scope_Identity ()를 선택하십시오. 스케일러를 실행할 때 ID 값을 반환합니다.
* 연결 문자열에서 매개 변수 순서가 중요한 경우가 있습니다. * 공급자 매개 변수의 위치는 행을 추가 한 후 레코드 세트 커서를 끊을 수 있습니다. 우리는이 동작을 SQLOLEDB 공급자와 함께 보았습니다.
행이 추가 된 후 제공자가 연결 문자열에서 첫 번째 매개 변수 로 지정되지 않는 한 행 필드를 사용할 수 없습니다 . 공급자가 첫 번째 매개 변수를 제외하고 연결 문자열의 아무 곳에 나 있으면 새로 삽입 된 행 필드를 사용할 수 없습니다. 공급자를 첫 번째 매개 변수로 옮길 때 행 필드가 마술처럼 나타납니다.
ID 열이있는 테이블에 삽입 한 후 @@ IDENTITY를 참조하여 값을 얻을 수 있습니다. http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
이것은 약간 오래된 학교 일지 모르지만, 더 정확한 PHP 5.5 이전 버전을 사용하는 사람들이 많이 있습니다. 자세한 내용은 http://php.net/manual/en/function.mysql-insert-id.php 에서 확인할 수 있습니다 .
$last = mysql_insert_id();
참고 URL : https://stackoverflow.com/questions/7917695/sql-server-return-value-after-insert
'IT' 카테고리의 다른 글
파이썬의 스레드에서 반환 값을 얻는 방법은 무엇입니까? (0) | 2020.03.25 |
---|---|
TypeScript에서 객체 리터럴의 유형 정의 (0) | 2020.03.25 |
mysqldump 데이터 만 (0) | 2020.03.25 |
MonoTouch와 Objective-C를 어떻게 결정합니까? (0) | 2020.03.25 |
Java 비트 맵을 바이트 배열로 변환 (0) | 2020.03.25 |