2012-12-19 27 views
14

Làm cách nào để sử dụng trình gỡ lỗi trong sql 2008/2012 để bắt các giá trị rỗng trong bản ghi?Nhận cảnh báo vô hiệu trong các hàm tổng hợp trong sql

Xem:

drop table abc 

create table abc(
a int 
) 
go 
insert into abc values(1) 
insert into abc values(null) 
insert into abc values(2) 

select max(a) from abc 

(1 row(s) affected) 
Warning: Null value is eliminated by an aggregate or other SET operation. 

Bây giờ này có thể được rectifed bằng cách thực hiện:

SELECT max(isNull(a,0)) FROM abc 

đó là tốt, cho đến khi tôi đến với 200 truy vấn phù hợp với nhiều tầng lớp làm tổ, và kết quả một tập của 2000 hồ sơ lẻ. - Và sau đó không có đầu mối mà cột là ném cảnh báo.

Làm cách nào để thêm điểm ngắt có điều kiện (hoặc ngắt cảnh báo) trong trình gỡ lỗi SQL? (Nếu nó thậm chí còn có thể)

+8

Tại sao bạn cần phải nắm bắt những cảnh báo? SQL sẽ đơn giản bỏ qua các giá trị null, thường là điều đúng đắn cần làm. Trong ví dụ của bạn, nếu bảng của bạn chứa '{-1, null, -2}', 'max (a)' sẽ trả về '-1', trong khi' max (isnull (a, 0)) 'sẽ trả về' 0' . –

+0

Tôi muốn biết vị trí/lý do cảnh báo bị ném, để kiểm tra lại logic của tôi – Alex

Trả lời

3

Phần 1: Giới thiệu về cảnh báo tổng hợp ...
Xem xét nhiều cấp độ làm tổ của bạn Tôi sợ không có cách nào đơn giản để xem bản ghi nào kích hoạt các cảnh báo đó.

Tôi cho rằng bức ảnh đẹp nhất của bạn là xóa từng hàm tổng hợp, mỗi lần, từ phần SELECT của câu lệnh cấp cao nhất và chạy truy vấn để bạn có thể thấy tổng hợp nào đang gây cảnh báo ở cấp cao nhất (nếu Bất kỳ)

Sau đó, bạn nên chuyển sang truy vấn lồng nhau và di chuyển từng truy vấn phụ cung cấp tập hợp cấp cao nhất đến cửa sổ riêng và chạy ở đó, kiểm tra cảnh báo. Bạn nên lặp lại điều này cho các cấp độ làm tổ bổ sung để tìm hiểu điều gì thực sự gây ra cảnh báo.

Bạn cũng có thể sử dụng phương pháp sau.

Phần 2: Giới thiệu về điểm ngắt có điều kiện ...
Vì mục đích gỡ lỗi, bạn di chuyển mỗi bảng lồng nhau ra và đặt dữ liệu của nó vào bảng tạm thời. Sau đó bạn kiểm tra các giá trị null trong bảng tạm thời đó. Bạn đặt một điểm ngắt trong câu lệnh IF. Tôi tin rằng đây là điều tốt nhất gần với điểm ngắt có điều kiện.(NẾU khoản có thể được thay đổi để xây dựng các điều kiện khác)

Dưới đây là một ví dụ rắn,
Thay vì điều này:

SELECT A.col1, A.col2, SUM(A.col3) as col3 
FROM (SELECT X as col1, Y as col2, MAX(Z) as col3 
     FROM (SELECT A as X, B as Y, MIN(C) as Z 
      FROM myTableC 
      ) as myTableB 
    ) as myTableA 

làm điều này:

SELECT A as X, B as Y, MIN(C) as Z 
INTO #tempTableC 
FROM myTableC 

IF EXISTS (SELECT * 
      FROM #tempTableC 
      WHERE A IS NULL) BEGIN 
    SELECT 'A' --- Breakpoint here 
END 


SELECT X as col1, Y as col2, MAX(Z) as col3 
INTO #tempTableB 
FROM #tempTableC 

IF EXISTS (SELECT * 
      FROM #tempTableB 
      WHERE X IS NULL) BEGIN 
    SELECT 'B' --- Breakpoint here 
END 

SELECT col1, col2, SUM(col3) as col3 
FROM #tempTableB as myTableA 
2

chức năng tổng hợp loại trừ giá trị null theo định nghĩa, vì vậy bạn chỉ có thể viết

select max (a) from abc 

thay vì

SELECT max(isNull(a,0)) FROM abc 

trừ khi tất cả các giá trị của một trong abc là null, trong đó truy vấn thứ hai sẽ trả về không thay vì null.

Nếu bạn muốn ngăn chặn các giá trị rỗng được nhập, hãy sử dụng một ràng buộc không null trên cột bảng.

0

Bạn sẽ phải viết truy vấn thứ hai để lấy dữ liệu bạn đang tìm kiếm.

SELECT * FROM abc WHERE a IS NULL 

Bạn có thể đặt điều đó vào câu lệnh IF để viết thông báo lỗi hoặc đăng nhập vào bảng. Ngoài ra, bạn sẽ không may mắn. Lấy làm tiếc. :/

1

Bạn có thể tắt các cảnh báo bằng cách thực hiện:

set ansi_warnings off 

Điều này được giải thích here. Điều này làm việc, ít nhất là trên các hệ thống tôi đã thử nghiệm nó trên, để loại bỏ các cảnh báo khi tổng hợp về giá trị NULL.

Điều này được cho là có tác dụng khác khi chuyển đổi số tràn và chia cho 0 thành NULL thay vì lỗi. Tuy nhiên, tôi vẫn gặp lỗi khi chia cho 0 và tràn số học.

Ngoài ra, khi sử dụng SQL Server Management Studio, người ta hiếm khi thấy thông báo này. Khi truy vấn thành công, thông báo nằm trên tab "Tin nhắn". Tuy nhiên, SSMS mặc định là tab "Kết quả" và thường không có lý do gì để xem các thông báo (mặc dù có cảnh báo). Bạn chỉ thấy cảnh báo tự động khi có lỗi trong truy vấn và SSMS mặc định là tab thư.

0

Thay Bạn có thể bỏ qua để có hàng với giá trị null

SELECT MAX(a) FROM abc WHERE a IS NOT NULL 
Các vấn đề liên quan