8
votes

Comment savoir si SQL stocké dans une variable retournera des lignes

Si j'ai un script SQL stocké dans une variable comme celle-ci:

IF EXISTS(@SQL) print 'yes, there are rows' -- Dummy code -- does not work!


2 commentaires

Vous devez exécuter cette déclaration SQL et voir si cela vous donne des résultats ...


Vous allez devoir lancer une requête SQL pour déterminer s'il y a des rangées ...


3 Réponses :


9
votes

Bien sûr, vous devez exécuter le script. Pour éviter de devoir insérer le résultat dans une table et compter les lignes, vous pouvez utiliser sp_executesql code> et un paramètre de sortie.

DECLARE @Statement NVARCHAR(MAX) = 'SELECT * FROM Employees WHERE Age > 80'

DECLARE @DynSQL NVARCHAR(max) = N'SET @Exists = CASE WHEN EXISTS(' + 
                                @Statement + 
                                N') THEN 1 ELSE 0 END'

DECLARE @Exists bit
EXEC sp_executesql @DynSQL,
                   N'@Exists bit OUTPUT',
                   @Exists = @Exists OUTPUT

SELECT @Exists AS [Exists]


2 commentaires

@Craighb - Bien! Espérons que les questions sont toutes prédéfinies et non de la part de l'utilisateur en raison de possibilités d'injection SQL évidentes.


Oui, prédéfini et à l'intérieur d'un proc.



0
votes

Vous pouvez essayer une solution hors de la boîte.

Par exemple. Gardez une trace d'une seule variable appelée emp_over_80. Chaque fois que vous ajoutez un employé à cet âge, emp_over_80 ++. Lorsque vous enlevez un, emp_over_80--

Au début de chaque journée, exécutez une requête pour déterminer la valeur de Emp_Over_80 (il peut s'agir de l'anniversaire d'un employé). Ensuite, tout au long de la journée, vous pouvez vous référer à emp_over_80 au lieu de réexécuter la requête SQL.

D'autres options seraient à garder la table des employés triés par âge. Si le dernier employé est supérieur à 80 ans, votre requête reviendra au moins une ligne.

Maintenant, beaucoup pourraient dire que ce sont des pratiques de codage horribles et je suis d'accord avec eux. Mais, je ne vois pas une autre façon de connaître comme par magie le résultat (même un résultat partiel) d'une requête avant qu'il ne court.


1 commentaires

Ah, je vois aussi. L'original Q était basé sur '[pas] avoir à exécuter le script'



2
votes

Alors que la réponse de Martin est également valide mais ne pouvons-nous pas simplement utiliser le @@ RowCount après avoir exécuté le script? Comme xxx

Notez que la requête a une déclaration de variable en elle, qui ne peut évidemment pas être utilisée avec Exist ()


2 commentaires

Tu peux le faire. existe est plus efficace car il peut s'arrêter après la première ligne correspondante au lieu de les compter tous.


@Martin: Existe convenu est plus efficace. Mais je pensais à la requête, avoir plus que une déclaration de sélection unique.