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
*/