이 코드가 있습니다 :
string insertSql =
"INSERT INTO aspnet_GameProfiles(UserId,GameId) VALUES(@UserId, @GameId)";
using (SqlConnection myConnection = new SqlConnection(myConnectionString))
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
myCommand.Parameters.AddWithValue("@UserId", newUserId);
myCommand.Parameters.AddWithValue("@GameId", newGameId);
myCommand.ExecuteNonQuery();
myConnection.Close();
}
이 테이블에 삽입 할 때 auto_increment int 기본 키 열 GamesProfileId
이 있습니다.이 ID를 사용하여 다른 테이블에 삽입 할 수 있도록 마지막에 삽입 된 열을 어떻게 얻을 수 있습니까?
답변
SQL Server 2005+의 경우 삽입 트리거가없는 경우 삽입 명령문 (모두 한 줄씩, 여기에서는 명확성을 위해 분할)을 다음과 같이 변경하십시오.
INSERT INTO aspnet_GameProfiles(UserId,GameId)
OUTPUT INSERTED.ID
VALUES(@UserId, @GameId)
SQL Server 2000의 경우 또는 삽입 트리거가있는 경우 :
INSERT INTO aspnet_GameProfiles(UserId,GameId)
VALUES(@UserId, @GameId);
SELECT SCOPE_IDENTITY()
그리고
Int32 newId = (Int32) myCommand.ExecuteScalar();
답변
다음과 CommandText
같은 명령을 만들 수 있습니다
INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)
실행하십시오 int id = (int)command.ExecuteScalar
.
이 MSDN 기사에서는 몇 가지 추가 기술을 제공합니다.
답변
string insertSql =
"INSERT INTO aspnet_GameProfiles(UserId,GameId) VALUES(@UserId, @GameId)SELECT SCOPE_IDENTITY()";
int primaryKey;
using (SqlConnection myConnection = new SqlConnection(myConnectionString))
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
myCommand.Parameters.AddWithValue("@UserId", newUserId);
myCommand.Parameters.AddWithValue("@GameId", newGameId);
primaryKey = Convert.ToInt32(myCommand.ExecuteScalar());
myConnection.Close();
}
이 악한 일 🙂
답변
나는 똑같은 필요가 있었고이 대답을 찾았습니다 ..
이렇게하면 회사 테이블 (comp)에 레코드가 작성되고 회사 테이블에서 작성된 자동 ID를 가져 와서 직원 테이블 (스태프)에 놓아 두 테이블을 연결할 수 있으므로 많은 직원이 한 회사에 연결됩니다. 내 SQL 2008 DB에서 작동하며 SQL 2005 이상에서 작동해야합니다.
============================
CREATE PROCEDURE [dbo].[InsertNewCompanyAndStaffDetails]
@comp_name varchar(55) = 'Big Company',
@comp_regno nchar(8) = '12345678',
@comp_email nvarchar(50) = 'no1@home.com',
@recID INT OUTPUT
– ‘ @recID’ 는 회사에서 자동 생성하려는 ID 번호를 보유하는 데 사용됩니다.
AS
Begin
SET NOCOUNT ON
DECLARE @tableVar TABLE (tempID INT)
-위의 줄은 나중에 사용하기 위해 자동 생성 된 ID 번호를 보유 할 임시 테이블을 만드는 데 사용됩니다. 그것은 단지 하나의 필드 ‘TEMPID’을 가지고 있으며, 그 유형 INT는 과 동일 ‘@recID’ .
INSERT INTO comp(comp_name, comp_regno, comp_email)
OUTPUT inserted.comp_id INTO @tableVar
– ‘ OUTPUT이 삽입되었습니다. ‘위의 행은 현재 작성중인 레코드의 필드에서 데이터를 가져 오는 데 사용됩니다. 우리가 원하는이 데이터는 ID 자동 번호입니다. 따라서 테이블의 올바른 필드 이름이 ‘comp_id’ 인지 확인하십시오 . 그런 다음 이전에 만든 임시 테이블로 삭제됩니다.
VALUES (@comp_name, @comp_regno, @comp_email)
SET @recID = (SELECT tempID FROM @tableVar)
-위의 줄은 필요한 ID가 저장되어있는 이전에 만든 임시 테이블을 검색하는 데 사용됩니다. 이 임시 테이블에는 하나의 레코드 만 있고 하나의 필드 만 있기 때문에 필요한 ID 번호 만 선택하여 ‘ @recID ‘에 드롭합니다 . ‘ @recID ‘에는 원하는 ID 번호가 있으며 아래에서 사용한 것처럼 원하는 방식으로 사용할 수 있습니다.
INSERT INTO staff(Staff_comp_id)
VALUES (@recID)
End
-그렇습니다. 실제로 ‘OUTPUT insert.WhatEverFieldNameYouWant’ 줄 에서 원하는 것을 잡고 임시 테이블에서 원하는 필드를 만들고 원하는 방식으로 액세스 할 수 있습니다.
나는 세세한 세분화와 함께 오랜 세월 동안 이와 같은 것을 찾고 있었는데 이것이 도움이되기를 바랍니다.
답변
순수한 SQL에서 주요 문장은 다음과 같습니다.
INSERT INTO [simbs] ([En]) OUTPUT INSERTED.[ID] VALUES ('en')
대괄호는 테이블 단순을 정의한 다음 열 En 및 ID를 정의하고, 대괄호는 시작할 열의 열거를 정의한 다음 열 값 (내 경우에는 하나의 열과 하나의 값)을 정의합니다. 아포스트로피는 문자열을 묶습니다.
나는 당신에게 나의 접근법을 설명 할 것이다 :
이해하기 쉽지 않을 수도 있지만 마지막으로 삽입 된 ID를 사용하여 큰 그림을 얻는 것이 유용하기를 바랍니다. 물론 더 쉬운 대안이 있습니다. 그러나 나는 내 것을 유지해야 할 이유가 있습니다. 관련 함수는 이름 및 매개 변수 이름 만 포함됩니다.
의료 인공 지능에이 방법을 사용합니다. 방법이 원하는 문자열이 중앙 테이블에 있는지 확인합니다 (1). 원하는 문자열이 중앙 테이블 “simbs”에 없거나 중복이 허용되는 경우 원하는 문자열이 중앙 테이블 “simbs”(2)에 추가됩니다. 마지막으로 삽입 된 ID는 관련 테이블 (3)을 만드는 데 사용됩니다.
public List<int[]> CreateSymbolByName(string SymbolName, bool AcceptDuplicates)
{
if (! AcceptDuplicates) // check if "AcceptDuplicates" flag is set
{
List<int[]> ExistentSymbols = GetSymbolsByName(SymbolName, 0, 10); // create a list of int arrays with existent records
if (ExistentSymbols.Count > 0) return ExistentSymbols; //(1) return existent records because creation of duplicates is not allowed
}
List<int[]> ResultedSymbols = new List<int[]>(); // prepare a empty list
int[] symbolPosition = { 0, 0, 0, 0 }; // prepare a neutral position for the new symbol
try // If SQL will fail, the code will continue with catch statement
{
//DEFAULT und NULL sind nicht als explizite Identitätswerte zulässig
string commandString = "INSERT INTO [simbs] ([En]) OUTPUT INSERTED.ID VALUES ('" + SymbolName + "') "; // Insert in table "simbs" on column "En" the value stored by variable "SymbolName"
SqlCommand mySqlCommand = new SqlCommand(commandString, SqlServerConnection); // initialize the query environment
SqlDataReader myReader = mySqlCommand.ExecuteReader(); // last inserted ID is recieved as any resultset on the first column of the first row
int LastInsertedId = 0; // this value will be changed if insertion suceede
while (myReader.Read()) // read from resultset
{
if (myReader.GetInt32(0) > -1)
{
int[] symbolID = new int[] { 0, 0, 0, 0 };
LastInsertedId = myReader.GetInt32(0); // (2) GET LAST INSERTED ID
symbolID[0] = LastInsertedId ; // Use of last inserted id
if (symbolID[0] != 0 || symbolID[1] != 0) // if last inserted id succeded
{
ResultedSymbols.Add(symbolID);
}
}
}
myReader.Close();
if (SqlTrace) SQLView.Log(mySqlCommand.CommandText); // Log the text of the command
if (LastInsertedId > 0) // if insertion of the new row in the table was successful
{
string commandString2 = "UPDATE [simbs] SET [IR] = [ID] WHERE [ID] = " + LastInsertedId + " ;"; // update the table by giving to another row the value of the last inserted id
SqlCommand mySqlCommand2 = new SqlCommand(commandString2, SqlServerConnection);
mySqlCommand2.ExecuteNonQuery();
symbolPosition[0] = LastInsertedId; // mark the position of the new inserted symbol
ResultedSymbols.Add(symbolPosition); // add the new record to the results collection
}
}
catch (SqlException retrieveSymbolIndexException) // this is executed only if there were errors in the try block
{
Console.WriteLine("Error: {0}", retrieveSymbolIndexException.ToString()); // user is informed about the error
}
CreateSymbolTable(LastInsertedId); //(3) // Create new table based on the last inserted id
if (MyResultsTrace) SQLView.LogResult(LastInsertedId); // log the action
return ResultedSymbols; // return the list containing this new record
}
답변
나는 위를 시도했지만 작동하지 않았다. 나는이 생각을 발견했다.
var ContactID = db.GetLastInsertId();
코드가 적고 넣기가 쉽습니다.
이것이 누군가를 돕기를 바랍니다.
답변
SQL Server에서 SCOPE_IDENTITY에 대한 호출을 사용할 수도 있습니다.