2012-03-23 31 views
7

Tôi có một thủ tục lưu sẵn có câu lệnh if trong đó. Nếu số lượng hàng được tính lớn hơn 0 thì nó sẽ đặt thông số đầu ra duy nhất @UserId thành 0Giá trị trả về trong thủ tục lưu sẵn SQL Server

Tuy nhiên, nó chỉ trả về giá trị trong phần thứ hai của truy vấn.

@EmailAddress varchar(200), 
@NickName varchar(100), 
@Password varchar(150), 
@Sex varchar(50), 
@Age int, 
@EmailUpdates int, 
@UserId int OUTPUT 
IF 
    (SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress) > 0 
    BEGIN 
     SET @UserId = 0 
    END 
ELSE 
    BEGIN 
     INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates) 
     SELECT SCOPE_IDENTITY() 
    END 

END 
+1

Ý anh là gì bằng cách "trả về một giá trị trong phần thứ hai của câu hỏi"? Tham số đầu ra sẽ không được trả về như một recordset –

Trả lời

5

Bạn có thể làm 1 trong các cách sau:

Thay đổi:

SET @UserId = 0 để SELECT @UserId

này sẽ trả về giá trị trong cùng một cách phần 2 của bạn của IF tuyên bố là.


Hoặc, thấy như @UserId được thiết lập như một đầu ra, thay đổi:

SELECT SCOPE_IDENTITY()-SET @UserId = SCOPE_IDENTITY()


Nó phụ thuộc vào cách bạn muốn truy cập dữ liệu sau đó. Nếu bạn muốn giá trị nằm trong tập kết quả của bạn, hãy sử dụng SELECT. Nếu bạn muốn truy cập các giá trị mới của tham số @UserId sau đó, sau đó sử dụng SET @UserId


Thấy như bạn chấp nhận các điều kiện thứ 2 là đúng, truy vấn bạn có thể viết (mà không cần phải thay đổi bất cứ điều gì ngoài truy vấn này) là:

@EmailAddress varchar(200), 
@NickName varchar(100), 
@Password varchar(150), 
@Sex varchar(50), 
@Age int, 
@EmailUpdates int, 
@UserId int OUTPUT 
IF 
    (SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress) > 0 
    BEGIN 
     SELECT 0 
    END 
ELSE 
    BEGIN 
     INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates) 
     SELECT SCOPE_IDENTITY() 
    END 

END 
+0

Hi Ive đã thử thiết lập phần thứ hai để đặt @UserId nhưng không hoạt động hoặc –

+0

@andrewslaughter Xem chỉnh sửa của tôi. Cả hai điều kiện hiện đang sử dụng 'SELECT', điều này sẽ trả về một giá trị trong tập kết quả của bạn. Nhìn vào câu hỏi của bạn, có vẻ như đó là cách bạn truy cập giá trị từ truy vấn này – Curt

+0

SELECT 0 hoạt động nhờ tuyệt vời –

0

Cố gắng gọi proc bạn theo cách này:

DECLARE @UserIDout int 

EXEC YOURPROC @EmailAddress = 'sdfds', @NickName = 'sdfdsfs', ..., @UserId = @UserIDout OUTPUT 

SELECT @UserIDout 
+0

@AndreyGurinov Tôi không thấy điều này sẽ giải quyết vấn đề .. UserId sẽ vẫn là NULL cho điều kiện thứ 2. – Curt

+0

Hi cảm ơn vì rằng Nếu tôi ExecuteStoredProcedure từ đối tượng nhà thám hiểm và đặt các thông số trong lần đầu tiên tôi chạy nó, tôi nhận được trong cửa sổ kết quả (không có tên cột) 64 (đây là chèn qua người dùng id) & UserId NULL Return value 0 Nếu tôi sau đó chạy nó một lần nữa tôi chỉ nhận được & UserId 0 giá trị trả về 0 –

1

tôi có thể đề nghị làm pre-init của giá trị chỉ số tương lai, điều này rất hữu ích trong nhiều trường hợp như nhiều công việc, một số xuất khẩu e.t.c.

chỉ cần tạo thêm User_Seq bảng: với hai lĩnh vực: id Uniq indexSeqVal nvarchar(1)

và tạo SP tiếp theo, và tạo ra giá trị ID từ SP này và đưa vào hàng tài khoản mới!

CREATE procedure [dbo].[User_NextValue] 
as 
begin 
    set NOCOUNT ON 


    declare @existingId int = (select isnull(max(UserId)+1, 0) from dbo.User) 

    insert into User_Seq (SeqVal) values ('a') 
    declare @NewSeqValue int = scope_identity()  

    if @existingId > @NewSeqValue 
    begin 

     set identity_insert User_Seq on 
     insert into User_Seq (SeqID) values (@existingId)  
     set @NewSeqValue = scope_identity()  
    end 

    delete from User_Seq WITH (READPAST) 

return @NewSeqValue 

end 
0
@EmailAddress varchar(200), 
@NickName varchar(100), 
@Password varchar(150), 
@Sex varchar(50), 
@Age int, 
@EmailUpdates int, 
@UserId int OUTPUT 
DECLARE @AA INT 
SET @AA=(SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress) 

IF @AA> 0 
    BEGIN 
     SET @UserId = 0 
    END 
ELSE 
    BEGIN 
     INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates) 
     SELECT SCOPE_IDENTITY() 
    END 

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