2014-12-30 13 views
7

Giả sử tôi có một truy vấn được lưu trữ trong một biến như thế này (nó thực sự động dân cư và phức tạp hơn, nhưng điều này là dành cho mục đích minh chứng):SQL "nếu tồn tại ..." dynamic query

DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable' 

Có một cách để kiểm tra xem truy vấn có trả về bất kỳ kết quả nào không? Một cái gì đó như thế này, nhưng điều này không làm việc:

IF EXISTS (@Query) 
BEGIN 
    -- do something 
END 

Cách duy nhất mà tôi có thể nghĩ ra để làm điều này là để đưa các kết quả trong một bảng tạm thời và sau đó truy vấn từ đó, nhưng đó không phải là lý tưởng vì các cột trong truy vấn động có thể khác nhau và tôi thực sự không cần bảng tạm thời vì bất kỳ lý do nào khác ngoài việc kiểm tra xem một số hàng có được trả về hay không. Có cách nào tốt hơn?

+0

Sau đó thử với truy vấn con EXISTS .... Làm điều gì đó tồn tại (chọn 1 từ dbo.MyTable). Cuối cùng, bạn đang kiểm tra bảng đó để thực hiện một số việc khác khi các bản ghi tồn tại trong bảng đó. – knkarthick24

+0

Truy vấn phụ là động, được lưu trữ trong một biến như được hiển thị ở trên. 'EXISTS' không hoạt động khi nó hoạt động. – mayabelle

Trả lời

11

Thử thực hiện Dynamic query và sử dụng @@RowCount để tìm sự tồn tại của hàng.

DECLARE @Query NVARCHAR(1000) = 'SELECT * FROM [dbo].[Mytable]', 
     @rowcnt INT 

EXEC Sp_executesql @query 

SELECT @rowcnt = @@ROWCOUNT 

IF @rowcnt > 0 
    BEGIN 
     PRINT 'row present' 
    END 
8

Hãy thử điều này:

DECLARE @Query NVARCHAR(1000) = 'SELECT @C = COUNT(*) FROM dbo.MyTable' 
DECLARE @Count AS INT 
EXEC sp_executesql @Query, N'@C INT OUTPUT', @[email protected] OUTPUT 

IF (@Count > 0) 
BEGIN 

END 
+1

Đối với 'sp_executesql',' @ Query' sẽ cần phải là 'nvarchar' – Dan

+0

Bạn nói đúng. Tôi chỉ sử dụng mã của anh ấy. – dario

0

Bạn có thể sử dụng EXEC để thực hiện câu lệnh SQL, sau đó gọi @@ROWCOUNT mà Trả về số hàng bị ảnh hưởng bởi tuyên bố cuối cùng, để kiểm tra hàng tồn tại trong sql select stetement.

DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable',@hasRow int 
EXEC (@Query) 
SELECT @hasRow [email protected]@ROWCOUNT // Returns the number of rows affected by the last statement 
PRINT @hasRow 

IF @hasRow > 0 
BEGIN 
    Print 1 
END 
BEGIN 
    Print 2 
END 
+1

Đã trả lời cùng một thời gian dài. –

+0

Tôi đang bận khi viết lại, bạn đã đăng, chúc mừng bạn. thậm chí bạn sử dụng Sp_executesql trong khi tôi đang sử dụng exec trực tiếp – HaveNoDisplayName

2

Tôi biết câu trả lời này đã quá muộn. nhưng, tôi để lại điều này ở đây để giúp người khác sử dụng IF EXISTS với truy vấn động.

Đây là cách bạn nên làm điều đó với truy vấn động.

DECLARE @Query VARCHAR(MAX) 

SET @Query = 'SELECT * FROM [dbo].[MyTable]' 

SET @Query = 'IF EXISTS (' + @Query + ') 
       BEGIN 
        -- do something 
        print ''1'' 
       END 
      ELSE 
       BEGIN 
        -- do something else 
        print ''0'' 
       END 
      ' 

exec (@Query) 

Hy vọng điều này sẽ giúp ai đó. Bình chọn nếu nó đã làm :)