SQL "if exists..." динамический запрос

Предположим, что у меня есть запрос, хранящийся в переменной вроде этого (она фактически динамически заполнена и более сложна, но это для демонстрационных целей):

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

Есть ли способ проверить, вернет ли запрос какие-либо результаты? Что-то вроде этого, но это не работает:

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

Единственный способ, который я могу придумать, - это поместить результаты в временную таблицу, а затем запросить от нее, но это не идеально, потому что столбцы в динамическом запросе могут меняться, и мне действительно не нужно временную таблицу вообще по какой-либо причине, кроме проверки того, будут ли возвращены некоторые строки. Есть ли лучший способ?

Ответ 1

Попробуйте выполнить Dynamic query и используйте @@RowCount, чтобы найти существование строк.

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 

Ответ 2

Попробуйте следующее:

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

Ответ 3

Я знаю, что этот ответ слишком поздний. но я оставляю это здесь, чтобы помочь кому-то другому использовать IF EXISTS с динамическим запросом.

Вот как вы должны это делать с динамическими запросами.

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)

Надеюсь, это помогло кому-то. Голосовать, если бы это было:)

Ответ 4

Вы можете использовать EXEC для выполнения инструкции sql, а затем вызвать @@ROWCOUNT, которая возвращает количество строк, затронутых последним оператором, чтобы проверить, существует ли строка в 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

Ответ 5

Привет, я думаю, что единственный способ - это вставить часть IF EXISTS в код исполнения. Мой случай - остановить выполнение в точке, когда select влияет хотя бы на одну строку, что является целью IF EXISTS.

Небольшой пример, который сохраняет чтение всех записей, охватывающих условие, до первого появления:

set nocount off;
drop table if exists #temp
go
create table #temp (idCol int identity(1,1),someText nvarchar(1))
go
insert into #temp values ('a')
go 25000

declare @query nvarchar(max)
,@resultFork bit
set @query = 'if exists (select * from #temp where idCol % 3 = 0)
    set @resultFork=1
    else
    set @resultFork=0'
print @query
exec sp_executeSQL @query, N'@resultFork int output', @[email protected] output
print @resultFork
/*Now U can use @resultFork in simple if condition...
if @resultFork = 1 
begin
    --
end
else 
begin
    --
end
*/