2012-01-31 60 views
7

Tôi đang tìm một cách hiệu quả hơn để hoàn thành nhiệm vụ này. Tôi cần phải thiết lập một biến bằng một ID nếu nó tồn tại, và nếu không chèn nó và sau đó thiết lập biến để nhận dạng được chèn vào. Tôi có thể thực hiện điều này bằng cách làm như sau:SQL Server Đặt biến nếu tồn tại khác chèn vào bảng

@VariableName --sent through to stored procedure 

DECLARE @VariableID [int] 

IF EXISTS(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName) 
    SET @VariableID = (SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName) 
ELSE 
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName) 
    SET @VariableID = SCOPE_IDENTITY(); 
END 

Tuy nhiên có vẻ như không hiệu quả để chạy cùng một truy vấn hai lần (kiểm tra nếu tồn tại và nếu nó đặt biến)

Chỉ cần tìm kiếm gợi ý về một cách tốt hơn để hoàn thành nhiệm vụ này.

Trả lời

14

Hãy thử:

DECLARE @VariableID [int] 
SELECT @VariableID=VariableID FROM VariableTable WHERE VariableName = @VariableName 

IF @VariableID IS NULL 
BEGIN 
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName) 
    SET @VariableID = SCOPE_IDENTITY(); 
END 
1

Hãy thử điều này:

INSERT INTO VariableTable (VariableID) 
SELECT SCOPE_IDENTITY() 
FROM VariableTable 
WHERE not exists 
(
SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName 
) 

Sau đó, nếu bạn cần id bạn sẽ phải đặt biến các @@ IDENTITY. Tôi nghĩ rằng điều này là hiệu quả nhất khi bạn không thực hiện một truy vấn thứ ba, nhưng chỉ cần nhận được ID cuối cùng được chèn vào.

1

Tôi đã thử nghiệm đoạn này và nó thực hiện một cách chính xác:

DECLARE @VariableID [int] 
SET @VariableID=(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName) 
IF @VariableID IS NULL 
BEGIN 
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName) 
    SET @VariableID = SCOPE_IDENTITY(); 
END 
+0

1 cho cú pháp SET, cho ansi. – goodeye

1

Dưới đây là một thay đổi Lite để @Mithrandir câu trả lời. Bạn có thể sử dụng TOP 1 giúp bạn tăng tốc kết quả khi bạn không so sánh với trường duy nhất. ví dụ.

DECLARE @EXISTS AS BIT 
SET @EXISTS = 0 
SELECT TOP 1 @EXISTS = 1 FROM MyTable WHERE MyYear = @Year 
0

Hãy thử ngoại lệ thú vị này. Hãy nhớ rằng không có BEGIN và END, vì vậy câu lệnh tiếp theo sau IF nên có điều kiện. Bây giờ hãy tự hỏi tại sao biến đầu tiên tồn tại:

declare @check binary 
declare @predeclared varchar(100) 
select @check = 0 

if @check = 1 
    declare @conditionaldeclare nvarchar(4000) 
    select @conditionaldeclare = 'conditionaldeclare' 
    print @conditionaldeclare 


if @check = 1 
    select @predeclared = 'predeclared' 
    print @predeclared 
Các vấn đề liên quan