次のような変数にクエリが格納されているとします(実際には動的に入力され、より複雑ですが、これはデモ用です)。
DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable'
クエリが結果を返すかどうかを確認する方法はありますか?このようなものですが、これは動作しません:
IF EXISTS (@Query)
BEGIN
-- do something
END
これを行うために私が考えることができる唯一の方法は、一時テーブルに結果を入れてからクエリすることですが、動的クエリの列は変化する可能性があり、一時テーブルは本当に必要ないため、これは理想的ではありません一部の行が返されるかどうかを確認する以外の理由でまったく。もっと良い方法はありますか?
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
これを試して:
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
この答えは遅すぎます。しかし、他の誰かが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)
これが誰かを助けたことを願っています。投票した場合:)
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
こんにちは私は唯一の方法は実行コードにIF EXISTS部分を入れることだと思います。私の場合は、selectが少なくとも1つの行に影響を与えるときに実行を停止することです。これが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
*/