2016-01-03 23 views
5

Tôi phải kiểm tra xem một số bản ghi có điều kiện cụ thể tồn tại trong bảng có thể không tồn tại và tôi phải làm điều này trong hàm vô hướng.Kiểm tra xem có bất kỳ bản ghi nào trong bảng có thể không tồn tại

Đây là mã của tôi:

CREATE FUNCTION CheckIfRecordsExistInTestTable() 
RETURNS INT 
BEGIN 
DECLARE @Result INT 
SELECT @Result = 
CASE WHEN OBJECT_ID('TestTable') IS NULL THEN 0 
ELSE 
CASE WHEN EXISTS(SELECT * FROM TestTable) THEN 
1 
ELSE 
0 
END 
END 
RETURN @Result 
END 

Trong khi cố gắng nó trong SQL Server thực hiện các tuyên bố sau đây:

SELECT dbo.CheckIfRecordsExistInTestTable() 

Bất cứ khi nào TestTable tồn tại nó sẽ trả về kết quả mong đợi của tôi. Nhưng bất cứ khi nào nó không, SQL Server đặt ra một ngoại lệ (tên đối tượng không hợp lệ 'TestTable') và tôi không thể có được những gì tôi mong đợi (tôi muốn có giá trị trả về 0 trong tình huống này). Vì vậy, những gì bạn đề xuất để làm cho vấn đề này mà có thể được mã hóa để một chức năng vô hướng?

Trả lời

4

Hãy thử thay đổi function như thế này

CREATE FUNCTION Checkifrecordsexistintesttable() 
returns INT 
    BEGIN 
     DECLARE @Result INT 

     IF Object_id('TestTable') IS NULL 
     SET @Result = 0 
     ELSE 
     SELECT @Result = CASE 
          WHEN EXISTS(SELECT 1 FROM testtable) THEN 1 
          ELSE 0 
         END 

     RETURN @Result 
    END; 

Để biết thêm về lý do đằng sau những lỗi mà bạn đang nhận được kiểm tra Martin của câu trả lời.

5

Câu trả lời khác đưa ra giải pháp đúng.

Vì sao bạn gặp sự cố ...

Đây là lỗi thời gian biên dịch.

Nếu câu lệnh tham chiếu đến việc biên dịch đối tượng không tồn tại được hoãn lại cho đến trước khi thực thi, nhưng cuối cùng vẫn cần phải biên dịch toàn bộ câu lệnh thành kế hoạch thực thi trước khi nó được thực hiện.

Điều này không thành công khi bảng không tồn tại và thực thi câu lệnh đó thậm chí không bắt đầu.

(Kế hoạch Thực hiện rằng nó cố gắng tạo - sử dụng một passthru predicate để tránh đánh giá tình trạng, nếu trường hợp không được đáp ứng)

enter image description here

Trong workaround các SELECT chống testtable được chuyển vào một khác nhau tuyên bố. Việc biên dịch câu lệnh này vẫn được trì hoãn và vì câu lệnh không bao giờ được thực thi, tất cả đều hoạt động tốt.

+2

Bạn là do con người thiên tài. Tôi đã cập nhật câu trả lời của mình. Chỉ là một người mới bắt đầu trong 'Sql Server' học tất cả những thứ này :) –

0

cập nhật chức năng như thế này:

CREATE FUNCTION CheckIfRecordsExistInTestTable() 
RETURNS INT 
BEGIN 
DECLARE @Result INT 
SELECT @Result = case when count(1) = 0 then 0 else 1 end from sys.tables where name = 'TestTable' 

RETURN @result 

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