109 votes

T-SQL: Parcourir une tableau de valeurs connues

Voici mon scénario :

Disons que j'ai une procédure stockée dans laquelle j'ai besoin d'appeler une autre procédure stockée sur un ensemble d'identifiants spécifiques ; est-ce possible de le faire ?

c'est-à-dire au lieu d'avoir à faire ceci :

exec p_MyInnerProcedure 4
exec p_MyInnerProcedure 7
exec p_MyInnerProcedure 12
exec p_MyInnerProcedure 22
exec p_MyInnerProcedure 19

Faire quelque chose comme ceci :

*magie où je spécifie que ma liste contient 4,7,12,22,19*

DECLARE my_cursor CURSOR FAST_FORWARD FOR
*magie sélectionner*

OPEN my_cursor 
FETCH NEXT FROM my_cursor INTO @MyId
WHILE @@FETCH_STATUS = 0
BEGIN

exec p_MyInnerProcedure @MyId

FETCH NEXT FROM my_cursor INTO @MyId
END

Mon objectif principal ici est simplement la maintenabilité (facile à supprimer/ajouter des identifiants au fur et à mesure que l'entreprise évolue), pouvoir lister tous les identifiants sur une seule ligne... La performance ne devrait pas être un aussi grand problème

2voto

Moshe Points 21
CRÉER TABLE #ListOfIDs (IDValue INT)

DÉCLARER @IDs VARCHAR(50), @ID VARCHAR(5)
SET @IDs = @OriginalListOfIDs + ','

TANT QUE LEN(@IDs) > 1
DÉBUT
SET @ID = SUBSTRING(@IDs, 0, CHARINDEX(',', @IDs));
INSERER DANS #ListOfIDs (IDValue) VALEURS(@ID);
SET @IDs = REMPLACER(',' + @IDs, ',' + @ID + ',', '')
FIN

SÉLECTIONNER * 
DE #ListOfIDs

0voto

LoMaPh Points 287

Établissez une connexion à votre base de données en utilisant un langage de programmation procédurale (ici Python) et faites la boucle là-bas. De cette façon, vous pouvez également réaliser des boucles compliquées.

# établir une connexion à votre base de données
import pyodbc
conn = pyodbc.connect('''
                        Driver={ODBC Driver 13 for SQL Server};
                        Server=serverName;
                        Database=DBname;
                        UID=userName;
                        PWD=password;
                      ''')
cursor = conn.cursor()

# exécuter du code sql
for id in [4, 7, 12, 22, 19]:
  cursor.execute('''
    exec p_MyInnerProcedure {}
  '''.format(id))

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