2010-07-14 3 views
1

Je suis sûr que cela est discuté quelque part, mais après avoir cherché pendant un moment je ne peux pas le trouver.Résultats des requêtes à la liste dans SP

Je crée une procédure stockée pour SQL 2000 et j'ai besoin de construire une liste de nombres que je peux utiliser dans une fonction IN.

La requête ressemble à ceci

SELECT DISTINCT type FROM dbo.table WHERE building = @currentBuilding 

Ceci renvoie généralement entre 1-5 résultats, je suis à la recherche d'un moyen de mettre cela en un nvarchar ou quelque chose.

Je voudrais rêver il y a un moyen facile de le faire puisque c'est dans une colonne mais j'ai l'impression que je vais finir par itérer sur les résultats.

En tant que côté, nvarchar est-il la bonne variable à utiliser? Y a-t-il une meilleure façon de stocker ceux qui permettraient de travailler plus rapidement?

Merci!

+1

Je suppose que il y a une raison pour laquelle vous ne pouvez pas juste mettre la requête directement dans la clause 'IN'? –

+0

@Martin Smith: Je pourrais juste le mettre dans la clause IN, mais je dois l'utiliser plusieurs fois, donc j'ai pensé que ce serait plus facile sur le serveur si je l'ai stocké comme variable. – Shaded

+0

Pas nécessairement. Cela dépend du coût de calcul. En supprimant la requête de son contexte d'origine, vous risquez de priver l'optimiseur de requêtes de certaines chances d'optimisation en fonction de la façon dont vous l'utilisez. Je présume que vous devez maintenant utiliser SQL dynamique ou une fonction de split pour l'utiliser? Si c'est le cas, une variable de table de colonne unique avec 'PRIMARY KEY' sur la colonne' type' pourrait être meilleure, sauf si vous avez besoin de passer la liste entre différentes procédures. –

Répondre

1

essayer quelque chose comme:

declare @All nvarchar(1000) 
SET @All=null 

SELECT 
    @All=ISNULL(@All+', ','')+CONVERT(varchar(10),d.value) 
    FROM (SELECT 1 AS Value UNION SELECT 22 UNION SELECT 333 UNION SELECT 4444) d 

PRINT @All 

SORTIE:

1, 22, 333, 4444 

c'est ce que vous pouvez utiliser:

SELECT 
    @All=ISNULL(@All+', ','')+CONVERT(varchar(10),d.type) 
    FROM (SELECT DISTINCT type 
       FROM dbo.table 
       WHERE building = @currentBuilding 
     ) d 
+0

@KM: Fonctionne comme un charme! Merci beaucoup! – Shaded

Questions connexes