226 votes

Variable SQL pour contenir une liste d'entiers

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 par le biais d'une liste déroulante à sélection multiple. La requête sous-jacente du rapport utilise cette liste de nombres entiers dans le champ where clause, par exemple

select *
from TabA
where TabA.ID in (@listOfIDs)

Je ne veux pas modifier la requête que je suis en train de déboguer mais je n'arrive pas à trouver comment créer une variable sur le serveur SQL qui puisse contenir ce type de données pour la tester.

par exemple

declare @listOfIDs int
set listOfIDs  = 1,2,3,4

Il n'y a pas de type de données qui puisse contenir une liste d'entiers, alors comment puis-je exécuter la requête du rapport sur mon serveur SQL avec les mêmes valeurs que le rapport ?

3voto

Ravi Anand Points 1319

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)

DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'
SELECT value
FROM STRING_SPLIT(@tags, ',')
WHERE RTRIM(value) <> '';

vous pouvez passer cette requête avec in comme suit :

SELECT *
  FROM [dbo].[yourTable]
  WHERE (strval IN (SELECT value FROM STRING_SPLIT(@tags, ',') WHERE RTRIM(value) <> ''))

3voto

J'utilise ceci :

1-Déclarez une variable de table temp dans le script que vous construisez :

DECLARE @ShiftPeriodList TABLE(id INT NOT NULL);

2-Allocation à la table temporaire :

IF (SOME CONDITION) 
BEGIN 
        INSERT INTO @ShiftPeriodList SELECT ShiftId FROM [hr].[tbl_WorkShift]
END
IF (SOME CONDITION2)
BEGIN
    INSERT INTO @ShiftPeriodList
        SELECT  ws.ShiftId
        FROM [hr].[tbl_WorkShift] ws
        WHERE ws.WorkShift = 'Weekend(VSD)' OR ws.WorkShift = 'Weekend(SDL)'

END

3-Référencer la table lorsque vous en avez besoin dans une instruction WHERE :

INSERT INTO SomeTable WHERE ShiftPeriod IN (SELECT * FROM @ShiftPeriodList)

2voto

thepirat000 Points 1873

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 :

DECLARE @listOfIDs NVARCHAR(MAX) = 
    '1,2,3'

DECLARE @query NVARCHAR(MAX) = 
    'Select *
     From TabA
     Where TabA.ID in (' + @listOfIDs + ')'

Exec (@query)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X