【问题标题】:SQL "if exists..." dynamic querySQL“如果存在...”动态查询
【发布时间】:2015-02-26 21:38:54
【问题描述】:

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

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

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

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

我能想到的唯一方法是将结果放在临时表中,然后从中查询,但这并不理想,因为动态查询中的列可能会有所不同,我真的不需要除了检查是否会返回某些行之外,完全出于任何原因访问临时表。有没有更好的办法?

【问题讨论】:

  • 然后尝试使用 EXISTS 子查询......在存在的地方做一些事情(从 dbo.MyTable 中选择 1)。最终,当该表中存在记录时,您将检查该表以执行其他操作。
  • 子查询是动态的,存储在如上所示的变量中。 EXISTS 在动态时不起作用。

标签: sql sql-server exists


【解决方案1】:

您好,我认为唯一的方法是将 IF EXISTS 部分放入执行代码中。 My case is to stop execution in point when select affects at least one row, that is goal of 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
*/

【讨论】:

    【解决方案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】:

      您可以使用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
      

      【讨论】:

      • 很久以前就回答过了。
      • 我在忙着回信,你发帖了,恭喜你。即使你在我使用直接执行时使用 Sp_executesql
      【解决方案4】:

      试试这个:

      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
      

      【讨论】:

      • 对于sp_executesql@Query 需要为nvarchar
      • 这很棒。到目前为止,我一直在使用临时表从动态生成的 SQL 结果集中获取数据。没想到你可以改用输出参数。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2014-05-06
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 2012-10-08
        • 2014-09-13
        相关资源
        最近更新 更多