2013-03-23 22 views
5

Tôi muốn gửi một số thông tin từ một máy khách đơn giản đến tệp nhật ký và sau đó sử dụng danh tính được tạo để xử lý tiếp.Sử dụng đúng chức năng SCOPE_IDENTITY trong quy trình lưu trữ đơn giản

Việc sử dụng SCOPE_IDENTITY() có đúng không?

CREATE PROCEDURE [dbo].[LogSearch] 
    @userName  VARCHAR(50), 
    @dateTimeStart DATETIME   
AS 
BEGIN 
SET NOCOUNT ON; 


    INSERT INTO [WH].[dbo].[tb_Searches] 
      (
      [UserName], 
      [DateTimeStart] 
      ) 
    SELECT @userName, 
     @dateTimeStart; 

    SELECT SCOPE_IDENTITY() AS ProfileKey; 

END; 

EDIT

tôi đã chỉnh sửa mã để điều sau đây:

ALTER PROCEDURE [dbo].[LogSearch] 
    @userName VARCHAR(50), 
    @dateTimeStart DATETIME 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [WH].[dbo].[tb_Searches] 
      (
      [UserName],[DateTimeStart] 
      ) 
    VALUES (@userName, @dateTimeStart); 

    RETURN SCOPE_IDENTITY(); 

END; 
+0

Có vẻ OK. Có nhiều cách để làm điều này - sử dụng giá trị trả về, sử dụng tham số 'output'. – Oded

+0

Các mối quan tâm cụ thể của bạn với điều này là gì? – Oded

+0

Tôi đang xây dựng ứng dụng máy khách-khách hàng đầu tiên của mình do đó là câu hỏi cơ bản. Proc này sẽ là thứ đầu tiên chạy và ID sẽ được chuyển xuống dòng, tức là ID sẽ quay trở lại client và sau đó được chuyển thành 3 hoặc 4 thủ tục khác được lưu trữ – whytheq

Trả lời

25

Có vẻ như đây là phương pháp tốt nhất - có thể thấy một vài tài liệu tham khảo tư vấn để chỉ sử dụng như một RETURN cách giao tiếp trạng thái hoặc lỗi sao cho thông số OUTPUT là thực hành tốt hơn:

ALTER PROCEDURE [dbo].[LogSearch] 
    @userName  VARCHAR(50), 
    @dateTimeStart DATETIME, 
    @searchID  INT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [WH].[dbo].[tb_Searches] 
       (
       UserName, 
       DateTimeStart 
       ) 
    VALUES 
       (
       @userName, 
       @dateTimeStart 
       ); 

    SET @searchID = SCOPE_IDENTITY(); 

END; 
3

Bạn cũng có thể sử dụng SCOPE_IDENTITY trong hai báo cáo riêng biệt, chẳng hạn như:

Giả sử rằng bảng có một lĩnh vực nhận dạng tất nhiên

Insert into [ABCTable] 
([A], [B]) 
select 'WhateverA', 'WhateverB' 

Sau đó sử dụng chức năng SCOPE_IDENTITY() trong mệnh đề Where, như :

Update [ABCTable] Set [A] = 'UpdateA', [B] = 'UpdateB' 
Where IdentityField = SCOPE_IDENTITY() 

Do đó, scope_identity là liên kết đáng tin cậy cho bản ghi chỉ cần inse rted.

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