web-dev-qa-db-fra.com

SQL "si existe ..." requête dynamique

Supposons que ma requête soit stockée dans une variable comme celle-ci (elle est en fait remplie de manière dynamique et plus complexe, mais à des fins de démonstration):

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

Existe-t-il un moyen de vérifier si la requête renvoie des résultats? Quelque chose comme ça, mais ça ne marche pas:

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

Le seul moyen auquel je puisse penser est de placer les résultats dans une table temporaire, puis d'effectuer une requête à partir de celle-ci, mais ce n'est pas idéal car les colonnes de la requête dynamique peuvent varier et je n'ai vraiment pas besoin de la table temporaire du tout pour une raison autre que celle de vérifier si certaines lignes seraient renvoyées. Y a-t-il un meilleur moyen?

10
mayabelle

Essayez d’exécuter le Dynamic query et utilisez @@RowCount pour rechercher l’existence de lignes.

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 
15
Pரதீப்

Essaye ça:

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

Je sais que cette réponse est trop tard. mais, je laisse ceci ici pour aider quelqu'un d'autre à utiliser IF EXISTS avec une requête dynamique.

Voici comment procéder avec les requêtes dynamiques.

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)

J'espère que cela a aidé quelqu'un. Votez si c'était le cas :)

2
Sam

Vous pouvez utiliser EXEC pour exécuter une instruction SQL, puis appeler @@ROWCOUNT, qui renvoie le nombre de lignes affectées par la dernière instruction, pour vérifier si une ligne existe dans l'instruction 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
0
HaveNoDisplayName