2011-12-22 31 views
20

Cố gắng gán một biến bên trong một nếu tồn tại điều khoản cho TSQLGán một biến bên trong một IF EXISTS khoản

DECLARE @myvar int 

IF EXISTS (SELECT @myvar = theTable.varIWant.....) 

Tôi nghĩ điều này sẽ làm việc, nhưng dường như không? Hoặc có lẽ (nhiều khả năng) tôi đang làm sai.

+1

Ok workaround đơn giản của tôi mà tôi sử dụng là CHỌN @myvar = .... và sau đó làm một IF (@myvar <> null) . Điều này giải quyết vấn đề của tôi và thậm chí làm cho nó hợp lý hơn nhưng Im vẫn quan tâm để biết Nếu tôi có thể gán nó. –

+1

Đoán của tôi là không, vì câu lệnh gán không trả về giá trị boolean thỏa mãn NẾU EXISTS – Sparky

Trả lời

20

Trong bản cài đặt SQL Server 2008 R2, nó đơn giản không biên dịch. Trình phân tích cú pháp than phiền về việc có cú pháp không chính xác gần =.

Tôi tin rằng nó phải có một cái gì đó để làm với việc phân bổ giá trị trộn và truy xuất dữ liệu trong một câu lệnh SELECT, không được phép trong SQL Server: bạn có thể có một hoặc khác. Vì khi gán giá trị, tập hợp hàng không được trả về nhưng biến vị ngữ EXISTS mong đợi là, không thể cho phép chuyển nhượng trong ngữ cảnh đó, vì vậy, để tránh nhầm lẫn, có lẽ, giới hạn phải được áp dụng rõ ràng.

Cách giải quyết của bạn, mà bạn đang nói đến trong nhận xét, là một phong nha, nhưng có thể không hoạt động tốt ở đâu đó ở giữa đợt khi biến đã có giá trị trước khi gán. Vì vậy, tôi có lẽ sẽ sử dụng workaround này thay vì:

SELECT @myvar = ... 
IF @@ROWCOUNT > 0 ... 

As per MSDN, hệ thống chức năng @@ROWCOUNT trả về số hàng đọc bởi truy vấn.

+0

+1 để sử dụng '@@ ROWCOUNT' – rabudde

+0

Hmm, tốt hơn về ngữ nghĩa. Câu trả lời này hay của Michael Petter? –

+0

@ Jeff.Clark: Ngữ nghĩa - không chắc chắn. Mỏ có ý nghĩa hoàn hảo với tôi và tôi không thấy bất kỳ vấn đề nào, từ quan điểm logic, với tùy chọn được đề xuất bởi Michael Petter. Có một vấn đề tiềm năng của một loại khác với giải pháp của anh ta, và tôi đã bày tỏ rằng trong câu trả lời của tôi. (Xem đoạn mà tôi đang thảo luận về cách giải quyết của OP, về cơ bản giống như gợi ý của Michael.) –

1

Nó sẽ không hoạt động chỉ vì trong máy chủ sql xây dựng tồn tại chỉ xác nhận nếu có bất kỳ hàng tồn tại và nó không quan trọng lựa chọn cột hoặc phần chuyển nhượng. Điều này được thực hiện để tối ưu hóa hiệu suất.

-2

Bạn đã thử đếm chưa?

SELECT @Exists = CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END 
FROM [dbname].[dbo].[tableorviewname]; 
7

Thay vì làm IF EXISTS, bạn chỉ có thể làm

DECLARE @myvar int 
SELECT @myvar = theTable.varIWant.....; 
IF @myvar IS NULL 
BEGIN... 
Các vấn đề liên quan