web-dev-qa-db-ja.com

SQL "存在する場合..."動的クエリ

次のような変数にクエリが格納されているとします(実際には動的に入力され、より複雑ですが、これはデモ用です)。

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

クエリが結果を返すかどうかを確認する方法はありますか?このようなものですが、これは動作しません:

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

これを行うために私が考えることができる唯一の方法は、一時テーブルに結果を入れてからクエリすることですが、動的クエリの列は変化する可能性があり、一時テーブルは本当に必要ないため、これは理想的ではありません一部の行が返されるかどうかを確認する以外の理由でまったく。もっと良い方法はありますか?

13
mayabelle

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 
18

これを試して:

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
14
dario

この答えは遅すぎます。しかし、他の誰かが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)

これが誰かを助けたことを願っています。投票した場合:)

2
Sam

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
0

こんにちは私は唯一の方法は実行コードに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
*/
0
Ondrej Liptak