2011-01-20 37 views
15

Chỉnh sửa: Sự cố tôi đã bắt nguồn từ sự trộn lẫn thứ tự tham số trong mã của tôi. Tôi chân thành cảm kích sự giúp đỡ của mọi người; sự hiểu biết về SQL của tôi càng tốt hơn mỗi lần truy cập vào SO.Chọn giá trị vô hướng từ một bảng

Tôi đang viết một quy trình được lưu trữ cần chọn một chút thông tin từ một bảng khác để thực hiện công việc của mình.

DECLARE @configVar int; 
SET @configVar = (SELECT ExampleSetting FROM Settings WHERE SettingID = 1); 
-- do something with @configVar to get the final result set 

Rõ ràng (đối với những người hiểu rõ hơn về SQL), điều trên không chính xác. Không có lỗi, trừ khi thủ tục được lưu trữ được thực hiện, @configVar được đặt thành NULL. Tôi đã kiểm tra lại bảng tôi đang chọn từ và đã đảm bảo rằng dữ liệu tồn tại.

Ai đó có thể cho biết sự hiểu lầm của tôi ở đâu và cách tôi sửa nó? Có vẻ như đây có thể là một thành ngữ phổ biến; điều này thường được thực hiện như thế nào?

Trả lời

30

TSQL cho phép bạn thiết lập các biến trong mệnh đề SELECT, sử dụng:

SELECT @configVar = s.examplesetting 
    FROM SETTINGS s 
WHERE s.settingid = 1 

này giả định chỉ có một bản ghi trong bảng trong đó giá trị settingid là 1.

Xem câu hỏi "TSQL - SET vs. SELECT when assigning variables?" cho thêm thông tin về cách sử dụng.

+0

@OMG Ngựa là toán tử trừ phải không? –

+0

@Conrad Frix: Đã sửa ngay trước khi tôi nhìn thấy bình luận của bạn. Typo trong khi tôi thêm bí danh bảng. –

+0

@OMG Ngựa. s'okay chỉ tự hỏi nếu nó là một cái gì đó tôi đã không nhìn thấy trước khi –

5
DECLARE @configVar int; 
SELECT @configVar = ExampleSetting FROM Settings WHERE SettingID = 1 
0

Bạn nên làm điều này thay vì:

SELECT @configVar = ExampleSetting FROM Settings WHERE SettingID = 1 

Lưu ý rằng nếu truy vấn của bạn trả về nhiều hơn một dòng biến của bạn sẽ tương đương với giá trị trả về cuối cùng trong bộ này.

+3

Tuyên bố không chính xác. Nó sẽ không cố gắng đặt nó thành "bộ". Nó hoặc là hoạt động (null hoặc giá trị), hoặc nó sẽ bom (Subquery trả về nhiều hơn 1 giá trị) – RichardTheKiwi

+0

chỉnh sửa để loại bỏ dòng vi phạm – Matthew

10

Rõ ràng (đối với những người hiểu rõ hơn về SQL), điều trên không chính xác.

Tại sao bạn lại nói vậy? Đó là một cách hoàn hảo hợp lệ, ngay cả khi nó có thể được viết như

SELECT @configVar = ExampleSetting FROM Settings WHERE SettingID = 1; 

Trong thực tế, nó sẽ cung cấp cho bạn một lỗi trong các hình thức đầu tiên khi có nhiều hàng trả lại (cố gắng truy vấn tiếp theo) cho phép bạn biết điều gì đó không phải là những gì bạn mong đợi, trong khi truy vấn thứ 2 ở trên âm thầm hoạt động bằng cách sử dụng giá trị ExampleSetting từ bản ghi khớp lần cuối.

DECLARE @configVar int; 
SET @configVar = (SELECT number FROM master..spt_values); 
-- Msg 512, Level 16, State 1, Line 2 
-- Subquery returned more than 1 value. 

Run này ngày của riêng mình và bạn có thể nhìn thấy cái gì mà ngạc nhiên bạn

SELECT ExampleSetting FROM Settings WHERE SettingID = 1 

Nếu đây trả về không có hồ sơ, đó là lý do tại sao SET @configVar là NULL trái

FYI, đây là những gì tôi đã cố gắng và nó hoạt động như được quảng cáo

DECLARE @configVar int; 
SET @configVar = (SELECT top 1 number FROM master..spt_values); 
select @configVar; 
-- result: -32768 

Một ngoại lệ cho việc bạn sử dụng 0 Biểu mẫuthay vì biểu mẫu SET from subquery là biến đầu tiên chỉ biến một mình khi truy vấn tìm thấy không có hàng phù hợp, thứ hai đặt rõ ràng là null.

DECLARE @configVar int; 
SET @configVar = 123; 
SET @configVar = (SELECT top 1 number FROM master..spt_values where 1=0); 
select @configVar; -- @configVar was set to NULL 

SET @configVar = 123; 
SELECT top 1 @configVar = number FROM master..spt_values where 1=0; 
select @configVar; -- @configVar is LEFT as 123 
+0

Sử dụng định dạng 'SET @configVar = (SELECT ...);', bạn có phải sử dụng các dấu ngoặc đơn không? Tôi tự hỏi nếu đó là lý do tại sao tôi đã nhận được lỗi cú pháp mang lại cho tôi ở đây. –

+1

Có bạn phải. Nếu không thì đó là lỗi cú pháp. Cú pháp là những gì cho phép mã được chính xác trong những gì được dự định. – RichardTheKiwi

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