web-dev-qa-db-fra.com

Requête SQL, stocker le résultat de SELECT dans une variable locale

Je crée une requête avec des résultats réutilisés. Je cherche un moyen de mettre le résultat dans une variable et de l'utiliser.

Un moyen simple de voir ce que je veux, quelque chose qui ressemble à ceci - je le veux:

DECLARE @result1 ?????

SET @result1 = SELECT a,b,c FROM table1
SELECT a AS val FROM @result1
UNION
SELECT b AS val FROM @result1
UNION
SELECT c AS val FROM @result1

Pas ça :

 SELECT a AS val FROM (SELECT a,b,c FROM table1)
 UNION
 SELECT b AS val FROM (SELECT a,b,c FROM table1)
 UNION
 SELECT c AS val FROM (SELECT a,b,c FROM table1)

Ce n'est pas le résultat de cette requête qui m'intéresse, mais plutôt:

  1. pour arrêter de sélectionner le résultat autant de fois - dans mon échantillon, j'ai resélectionné le tableau 3 fois

  2. la requête de @result1 est généralement beaucoup plus complexe. Donc, avec une variable, le code sera plus propre.

Peut-être que je veux beaucoup - ou il y a un type de variable locale. Ou en utilisant la table de types et définir les données à l'intérieur.

Que me proposez-vous?

Je vous remercie

43
forX

Vous pouvez créer des variables de table:

DECLARE @result1 TABLE (a INT, b INT, c INT)

INSERT INTO @result1
SELECT a, b, c
FROM table1

SELECT a AS val FROM @result1
UNION
SELECT b AS val FROM @result1
UNION
SELECT c AS val FROM @result1

Cela devrait aller pour ce dont vous avez besoin.

48
Vince Pergolizzi

Voici quelques autres approches que vous pouvez prendre.

1. CTE avec syndicat:

;WITH cte AS (SELECT a, b, c FROM table1)
SELECT a AS val FROM cte
UNION SELECT b AS val FROM cte
UNION SELECT c AS val FROM cte;

2. CTE avec unpivot:

;WITH cte AS (SELECT a, b, c FROM table1)
SELECT DISTINCT val
FROM cte
UNPIVOT (val FOR col IN (a, b, c)) u;
12
Anthony Faull

N’est-ce pas une solution beaucoup plus simple, si je comprends bien la question, bien sûr.

Je souhaite charger les adresses électroniques figurant dans une table appelée "spam" dans une variable. 

select email from spam

produit la liste suivante, par exemple:

.accountant
.bid
.buiilldanything.com
.club
.cn
.cricket
.date
.download
.eu

Pour charger dans la variable @list:

declare @list as varchar(8000)
set @list += @list (select email from spam)

@list peut maintenant être inséré dans une table, etc. 

J'espère que ça aide. 

Pour l'utiliser pour un fichier .csv ou en VB, pointez le code:

declare @list as varchar(8000)
set @list += @list (select '"'+email+',"' from spam)
print @list

et il produit un code tout prêt à utiliser ailleurs:

".accountant,"
".bid,"
".buiilldanything.com,"
".club,"
".cn,"
".cricket,"
".date,"
".download,"
".eu,"

On peut être très créatif. 

Merci

Nico

1
Nico van Niekerk

Je suis arrivé ici avec une question/un problème similaire, mais je n'avais besoin que d'une seule valeur pour être stockée à partir de la requête, pas d'un tableau/d'une table de résultats comme dans la publication d'origine. J'ai pu utiliser la méthode de table ci-dessus pour une valeur unique, mais je suis tombé sur un moyen plus simple de stocker une valeur unique.

declare @myVal int; set @myVal = isnull((select a from table1), 0);

Assurez-vous de définir par défaut la valeur de l'instruction isnull sur un type valide pour votre variable. Dans mon exemple, la valeur de table1 que nous stockons est un entier.

0
G. Gordon Nasseri