2012-01-13 58 views
26

Tôi có 3 chèn thủ tục lưu trữ mỗi chèn SP dữ liệu trong 2 bảng khác nhauGọi thủ tục lưu trữ từ một thủ tục lưu trữ SQL Server

Table 1   Table 2     
idPerson   idProduct    
name    productName    
phoneNumber  productdescription  
FK-idProduct 

SP cho bảng 1 SP cho bảng 2

create procedure test1    create procedure test2 
WITH         WITH 
EXECUTE as caller      EXECUTE as caller 
AS         AS 
declare        declare 

@idPerson int,      @idProduct int, 
@name varchar(20),     @productName varchar(50), 
@phone varchar(20)     @productoDescription varchar(50) 


    SET nocount on;      SET nocount on; 
    Begin        Begin 
     insert into table1(    insert into table2(
       idPerson,       idProduct, 
       name,        productName, 
       phone)        productDescription) 
      values(       values(
       @idPerson,       @idProduct, 
       @name,        @productName, 
       @phone)       @productDescription) 
     end        end 

tôi cần để gọi kiểm tra thủ tục lưu sẵn 2 từ thử nghiệm thủ tục lưu sẵn 1 và chèn FK-ID vào bảng 1

Trả lời

21

Chỉ cần gọi test2 từ test1 như:

EXEC test2 @newId, @prod, @desc; 

Hãy chắc chắn để có được @id sử dụng:

SELECT @newId = @@SCOPE_IDENTITY 
+0

nó sẽ làm chèn idPerson, tên, điện thoại và idProduct trong table1 và idProduct, productName và productDescription trong bảng 2? –

+0

@@ SCOPE_IDENTITY không phải là một điều. Sử dụng SCOPE_IDENTITY() – MPaul

6

Bạn có thể thêm một tham số OUTPUT để test2, và đặt nó là id mới thẳng sau khi INSERT sử dụng:

SELECT @NewIdOutputParam = SCOPE_IDENTITY() 

Sau đó, trong test1, hãy lấy nó như sau:

DECLARE @NewId INTEGER 
EXECUTE test2 @NewId OUTPUT 
-- Now use @NewId as needed 
+2

Hãy coi chừng rằng SCOPE_IDENTITY() không thể dựa vào để trả lại kết quả chính xác trừ khi bạn sử dụng MAX_DOP = 1 trên các phiên bản SQL trước năm 2012. (Xem tại đây: http://connect.microsoft.com/SQLServer/feedback/ chi tiết/328811 /) –

0

Trước hết, nếu table2 's idProduct là một bản sắc, bạn không thể chèn nó một cách rõ ràng cho đến khi bạn thiết lập IDENTITY_INSERT trên bàn

SET IDENTITY_INSERT table2 ON; 

rằng trước khi chèn.

Vì vậy, một trong hai, bạn sửa đổi thứ hai của bạn được lưu trữ và gọi nó là chỉ với những thông số productNameproductDescription và sau đó nhận được ID mới

EXEC test2 'productName', 'productDescription' 
SET @newID = SCOPE_IDENTIY() 

hoặc bạn đã có ID của sản phẩm và bạn don' t cần phải gọi SCOPE_IDENTITY() và có thể chèn vào table1 với ID đó

Các vấn đề liên quan