SQL"如果存在......"动态查询

时间:2014-12-30 18:01:23

标签: sql sql-server exists

假设我有一个存储在这样的变量中的查询(它实际上是动态填充的,而且更复杂,但这是出于演示目的):

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

有没有办法检查查询是否会返回任何结果?像这样的东西,但这不起作用:

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

我能想到的唯一方法是将结果放在临时表中,然后从中查询,但这并不理想,因为动态查询中的列可能会有所不同,而且我真的不喜欢这样。除了检查是否会返回某些行之外,任何原因都需要临时表。还有更好的方法吗?

5 个答案:

答案 0 :(得分:16)

尝试执行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 

答案 1 :(得分:10)

试试这个:

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

答案 2 :(得分:2)

我知道这个答案为时已晚。但是,我将此处留在此处以帮助其他人使用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)

希望这有助于某人。投票如果确实如此:)

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您好,我认为唯一的方法是将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
*/