Nhiệm vụ luồng dữ liệu tạo ra không có hàng với tuyên bố khai báo


7

Tôi có một gói SSIS đang thực hiện một SELECTcâu lệnh đơn giản và sau đó tải vào một bảng. Tôi đã ẩn danh câu lệnh sql sẽ rất rõ ràng khi bạn nhìn vào tên bảng. Tôi cũng đã đơn giản hóa gói để chỉ đếm số hàng cho mục đích của bản demo này.

Vấn đề này tôi gặp phải là truy vấn tạo ra các hàng trong máy chủ SQL nhưng không tạo ra các hàng nào trong SSIS. Các truy vấn như sau.

DECLARE @CurrentBlahDate DATETIME
SET @CurrentBlahDate = ( SELECT MAX(BlahDate)
                                         FROM   dbo.ThisCoolTable SL
                                                WITH ( NOLOCK )
                                                INNER JOIN dbo.ThatCoolTable SLF
                                                WITH ( NOLOCK ) ON SL.CoolID = SLF.CoolID
                                                              AND SLF.TypeCode IN (
                                                              'ValueA',
                                                              'ValueB' ))
SELECT 
*
FROM dbo.Calendar
WHERE CAST(BaseDate AS DATE) = CAST(@CurrentBlahDate AS DATE)

Hãy bỏ qua * vì đó chỉ là cho mục đích của bản demo này. Truy vấn thực tế có cùng một vấn đề mặc dù nó không có dấu *. Khi được thực thi trong máy chủ SQL, điều này trả về 1 hàng từ bảng lịch như mong đợi. Tuy nhiên, khi được thực hiện đối với cùng một môi trường trong SSIS, tôi không nhận được hàng nào.

SSIS

Nếu tôi biến truy vấn thành một thủ tục được lưu trữ và thực thi sproc trong SSIS, tôi sẽ nhận được số hàng là 1.

1 giờ

Nếu tôi thay đổi truy vấn này.

SELECT 
*
FROM dbo.Calendar
WHERE CAST(BaseDate AS DATE) = CAST(( SELECT MAX(BlahDate)
                                         FROM   dbo.ThisCoolTable SL
                                                WITH ( NOLOCK )
                                                INNER JOIN dbo.ThatCoolTable SLF
                                                WITH ( NOLOCK ) ON SL.CoolID = SLF.CoolID
                                                              AND SLF.TypeCode IN (
                                                              'ValueA',
                                                              'ValueB' )) AS DATE)

Sau đó tôi lại nhận được 1 hàng.

Thêm 1 hàng

Có bất kỳ lý do tôi đang thấy hành vi này?

CẬP NHẬT: Trước khi tôi nhận được một tấn flack cho điều này, tôi không có lựa chọn nào về NOLOCK vô nghĩa.


5
Tôi sẽ cho bạn lướt qua `CAST (BaseDate AS DATE)` cá nhân ...
billinkc

Lol một lần nữa điều này bị xáo trộn.
Zane

Câu trả lời:


10

Chà, mặc dù tôi không thực sự biết lý do đằng sau hành vi này, tôi nhớ đã đọc về điều này một thời gian trước đây và phải làm gì để khắc phục nó. Để thực hiện công việc này, bạn chỉ cần thêm SET NOCOUNT ONlàm dòng đầu tiên của lệnh sql:

SET NOCOUNT ON
DECLARE @CurrentBlahDate DATETIME
SET @CurrentBlahDate = ( SELECT MAX(BlahDate)
                                         FROM   dbo.ThisCoolTable SL
                                                WITH ( NOLOCK )
                                                INNER JOIN dbo.ThatCoolTable SLF
                                                WITH ( NOLOCK ) ON SL.CoolID = SLF.CoolID
                                                              AND SLF.TypeCode IN (
                                                              'ValueA',
                                                              'ValueB' ))
SELECT 
*
FROM dbo.Calendar
WHERE CAST(BaseDate AS DATE) = CAST(@CurrentBlahDate AS DATE)

1
Điều này làm việc tuyệt vời nhờ một tấn. Tuy nhiên nếu bất cứ ai tình cờ có một lời giải thích cho điều này, tôi sẽ rất vui khi nghe nó.
Zane

4

Lamak đã trả lời câu hỏi.

Lý do có thể là trong thời gian chạy gói, OLEDB sẽ xử lý kết quả đầu tiên. Vì vậy, khi lệnh chứa một biến, các DONE_IN_PROCthông báo sẽ được trả về dưới dạng các kết quả trống. Vì vậy, nguồn OLEDB sẽ lấy kết quả đầu tiên và sẽ tiếp tục, điều này sẽ dẫn gói thành công nhưng không có bất kỳ hàng nào.

Như Lamak đã chỉ ra rằng SET NOCOUNT ONsẽ ngăn chặn việc gửi các tin nhắn DONE_IN_PROC cho khách hàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.