2010-04-06 8 views
1

SQL 삽입을 수행하여 테이블을 채 웁니다. 하나의 테이블에 고유 한 생성 된 ID가 있습니다.이 ID는 다른 테이블에서 조인을 위해 사용하고 싶습니다. 이것이 가능한가?SQL 저장 프로 시저에 변수를 할당 할 수 있습니까?

.NET MVC -

using (SqlConnection connect = new SqlConnection(connections)) 
{ 
    SqlCommand command = new SqlCommand("ContactInfo_Add", connect); 
    command.Parameters.Add(new SqlParameter("name", name)); 
    command.Parameters.Add(new SqlParameter("address", address)); 
    command.Parameters.Add(new SqlParameter("Product", name)); 
    command.Parameters.Add(new SqlParameter("Quantity", address)); 
    command.Parameters.Add(new SqlParameter("DueDate", city)); 
    connect.Open(); 
    command.ExecuteNonQuery(); 
} 

SQL 서버 -

ALTER PROCEDURE [dbo].[Contact_Add] 
@name varchar(40), 
@address varchar(60), 
@Product varchar(40), 
@Quantity varchar(5), 
@DueDate datetime 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO DBO.PERSON 
    (Name, Address) VALUES (@name, @address) 
    INSERT INTO DBO.PRODUCT_DATA 
    (PersonID, Product, Quantity, DueDate) VALUES (@Product, @Quantity, @DueDate) 
END 

코드가 잘 삽입합니다. PRODUCT_DATA에서 사용할 자동 생성 PersonID를 가져 오려면 어떻게해야합니까?

+0

user54197는 KM의 대답과 내 의견 봐. 누군가가 모르게 스토어 프로 시저를 변경하면 범위 ID를 사용하여 PersonID를 리턴 할 때 잠재적 인 문제점이 있습니다. – msarchet

+0

@ msarchet : 이러한 잠재적 인 문제가 무엇인지 자세히 알아 보려면 어떻게해야합니까? 물론 누군가가 어떻게 작동하는지 알지 못하면 저장 프로 시저를 깨뜨릴 수 있지만'SCOPE_IDENTITY' 자체와는 아무런 관련이 없습니다. 또한 'OUTPUT INSERTED' 절을 깨뜨릴 수 있습니다. – LukeH

+0

정확히 방금 말한대로 SCOPE_IDENTITY 자체와 관련이 없으며 훌륭하게 작동합니다. 다른 사람이 저장 프로 시저의 순서를 변경하면 중단되지 않기 때문에 삽입 된 출력을 사용하는 것이 더 확실합니다. 그것은 분명히 당신이 가치를 반환하는 방법에 관계없이 누군가가 항상 당신의 SP를 깰 수 있기 때문에 완벽하지는 않습니다. '@variable int output'과 같은 매개 변수를 사용하는 것은 출력을 얻는 가장 확실한 방법입니다. 그러나 여전히 누군가가 그것을 깨뜨릴 수는 있지만 여전히 어렵습니다. – msarchet

답변

3

당신은 마지막으로 삽입 된 ID 값을 얻을 수 SCOPE_IDENTITY를 사용할 수 있습니다

DECLARE @PersonID INT 

INSERT INTO dbo.Person (Name, Address) 
VALUES (@Name, @Address) 

SET @PersonID = SCOPE_IDENTITY() 

INSERT INTO dbo.Product_Data (PersonID, Product, Quantity, DueDate) 
VALUES (@PersonID, @Product, @Quantity, @DueDate) 
+0

당신은 SCOPE_IDENTITY를 (사용하지 않고 두 테이블에 삽입 할 수 있습니다) 단일 INSERT 문에서, 방법에 대한 내 대답 체크 아웃 : http://stackoverflow.com/questions/2585723/can-i-assign-a-variable-in를 -a-sql-stored-procedure/2585918 # 2585918 –

+0

@KM : OUTPUT INSERTED 절을 사용하여 하나의 명령문으로 처리 할 수 ​​있다는 것을 알고 있습니다. 일반적으로 나는 각각의 문장을 더 읽기 쉽고 유지할 수있는 별도의 문장을 발견했다. – LukeH

6

당신은 SCOPE_IDENTITY()를 사용할 필요가 없습니다, OUTPUT 단일 INSERT 문을 사용!

CREATE TABLE Test1 (PersonID int identity(1,1), Name varchar(40), Address varchar(60)) 
CREATE TABLE Test2 (PersonID int, product varchar(40),Quantity varchar(5),DueDate datetime) 

코드

exec TestSP 'name','address','product',123,'1/1/2010' 
select * from Test1 
select * from Test2 
에게 절차를

CREATE PROCEDURE TestSP 
@name varchar(40), 
@address varchar(60), 
@Product varchar(40), 
@Quantity varchar(5), 
@DueDate datetime 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Test1 
      (Name, Address) 
      OUTPUT INSERTED.PersonID, @Product, @Quantity, @DueDate 
      INTO Test2 
     VALUES 
      (@name, @address) 

END 

테스트를 만들

설정 테이블을 :
이이에게 시도까지

SQL Server 2005 및 필요합니까

출력

PersonID Name     Address 
----------- -------------------- ----------------------- 
1   name     address 

(1 row(s) affected) 

PersonID product Quantity DueDate 
----------- --------- -------- ----------------------- 
1   product 123  2010-01-01 00:00:00.000 

(1 row(s) affected) 
+0

누군가가 스토어드 프로 시저를 변경하여 최종 값이 올바르지 않게 리턴 될 때까지 범위 ID를 사용하여 동의 한 것이 작동합니다. 죄송합니다. – msarchet

+0

이전에 보지 못했던 덕분에 – eftpotrm

+0

로그 테이블에 항목을 쉽게 추가 할 수 있습니다. 한 번에 여러 개의 OUTPUT 문을 사용할 수도 있습니다. 또한 INTO를 제거하면 결과 집합이 반환됩니다. 예를 들어'INTO Test2'와'VALUES' 사이에'OUTPUT INSERTED. * '를 넣으면됩니다. TestSP 프로 시저를 실행하면 두 개의 테이블에 삽입되어 Test1 테이블 (두 개의 INSERT와 SELECT가 하나의 INSERT 안에 포함 된 결과 집합)을 반환합니다. –

관련 문제