J'essaie de déboguer les rapports SQL de quelqu'un d'autre et j'ai placé la requête de rapports sous-jacente dans une fenêtre de requête de SQL 2012.
L'un des paramètres demandés par le rapport est une liste d'entiers. Ceci est réalisé sur le rapport via une liste déroulante à sélection multiple. La requête sous-jacente du rapport utilise cette liste d'entiers dans la where
clause eg
select *
from TabA
where TabA.ID in (@listOfIDs)
Je ne veux pas modifier la requête que je débogue mais je ne peux pas comprendre comment créer une variable sur le serveur SQL qui peut contenir ce type de données pour le tester.
par exemple
declare @listOfIDs int
set listOfIDs = 1,2,3,4
Aucun type de données ne peut contenir une liste d'entiers. Comment puis-je exécuter la requête de rapport sur mon serveur SQL avec les mêmes valeurs que le rapport?
sql-server
list
tsql
variables
reporting-services
ErickTreetops
la source
la source
Réponses:
Variable de table
ou
la source
SET @AddressIDs = (SELECT ID FROM address WHERE Account = 1234)
Cette requête renverra plusieurs ID et j'obtiens une erreur indiquant que la sous-requête a renvoyé plus d'un résultat et que ce n'est pas autorisé. Est-il possible de créer une variable qui stockera un tableau si les ID d'une sous-requête?En supposant que la variable s'apparente à:
Et la procédure stockée l'utilise sous cette forme:
Vous pouvez créer l'IntList et appeler la procédure comme ceci:
Ou si vous fournissez vous-même l'IntList
la source
Vous avez raison, il n'y a pas de type de données dans SQL-Server qui puisse contenir une liste d'entiers. Mais ce que vous pouvez faire, c'est stocker une liste d'entiers sous forme de chaîne.
Vous pouvez ensuite diviser la chaîne en valeurs entières séparées et les mettre dans une table. Votre procédure peut déjà le faire.
Vous pouvez également utiliser une requête dynamique pour obtenir le même résultat:
la source
Pour SQL Server 2016+ et Azure SQL Database, la fonction STRING_SPLIT a été ajoutée, ce qui serait une solution parfaite à ce problème. Voici la documentation: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
Voici un exemple:
Le résultat de la requête est 1,3
~ Acclamations
la source
En fin de compte, je suis arrivé à la conclusion que sans modifier le fonctionnement de la requête, je ne pouvais pas stocker les valeurs dans des variables. J'ai utilisé le profileur SQL pour attraper les valeurs, puis les ai codées en dur dans la requête pour voir comment cela fonctionnait. Il y avait 18 de ces tableaux d'entiers et certains contenaient plus de 30 éléments.
Je pense qu'il est nécessaire que MS / SQL introduise des types de données supplémentaires dans le langage. Les tableaux sont assez courants et je ne vois pas pourquoi vous ne pouvez pas les utiliser dans un processus stocké.
la source
Vous ne pouvez pas le faire comme ça, mais vous pouvez exécuter la requête entière en la stockant dans une variable.
Par exemple:
la source
Il existe une nouvelle fonction dans SQL appelée
string_split
si vous utilisez une liste de chaînes. Lien de référence STRING_SPLIT (Transact-SQL)vous pouvez transmettre cette requête
in
comme suit:la source
J'utilise ceci:
1-Déclarez une variable de table temporaire dans le script de votre bâtiment:
2-Allouer à la table temporaire:
3-Référencez la table lorsque vous en avez besoin dans une instruction WHERE:
la source