假设我有一个存储在这样的变量中的查询(它实际上是动态填充的,而且更复杂,但这是出于演示目的):
DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable'
有没有办法检查查询是否会返回任何结果?像这样的东西,但这不起作用:
IF EXISTS (@Query)
BEGIN
-- do something
END
我能想到的唯一方法是将结果放在临时表中,然后从中查询,但这并不理想,因为动态查询中的列可能会有所不同,而且我真的不喜欢这样。除了检查是否会返回某些行之外,任何原因都需要临时表。还有更好的方法吗?
答案 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
*/