SQL“如果存在…”动态查询

SQL“如果存在…”动态查询,sql,sql-server,exists,Sql,Sql Server,Exists,假设我有一个存储在如下变量中的查询,它实际上是动态填充的,而且更复杂,但这只是为了演示: DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable' 有没有办法检查查询是否会返回任何结果?像这样,但这不起作用: IF EXISTS (@Query) BEGIN -- do something END 我能想到的唯一方法是将结果放在临时表中,然后从临时表中进行查询,但这并不理想,因为动态查询中的列可以变化,除了检查是否返回某些行

假设我有一个存储在如下变量中的查询,它实际上是动态填充的,而且更复杂,但这只是为了演示:

DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable'
有没有办法检查查询是否会返回任何结果?像这样,但这不起作用:

IF EXISTS (@Query)
BEGIN
    -- do something
END
我能想到的唯一方法是将结果放在临时表中,然后从临时表中进行查询,但这并不理想,因为动态查询中的列可以变化,除了检查是否返回某些行之外,我真的不需要临时表。有更好的方法吗?

尝试执行动态查询并使用@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 
试试这个:

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

IF (@Count > 0)
BEGIN

END

您可以使用EXEC执行sql语句,然后调用@ROWCOUNT,返回受上一条语句影响的行数,以检查sql select语句中是否存在行

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

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

我知道这个答案太晚了。但是,我把它留在这里是为了帮助其他人使用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)

希望这对别人有帮助。若有,请投票:

嗨,我认为唯一的方法是将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', @resultFork=@resultFork output
print @resultFork
/*Now U can use @resultFork in simple if condition...
if @resultFork = 1 
begin
    --
end
else 
begin
    --
end
*/

然后尝试使用EXISTS子查询…在存在的地方执行某些操作从dbo.MyTable中选择1。最终,当该表中存在记录时,您将检查该表以执行其他操作。当它是动态的时候,存在是不起作用的。很久以前我也回答过。我在忙着回信,你发了帖子,恭喜你。即使您使用Sp_executesql,而我使用直接execFor Sp_executesql,@Query也需要是nvarharthat,这很好。到目前为止,我一直在使用临时表从动态生成的SQL结果集中获取数据。没有意识到可以使用输出参数。