0
votes

Quand SELECT ne peut-il pas faire une table comme sortie

Je suis un novice en SQL et je suis à la suite d'un tutoriel Web. J'ai rencontré un morceau de code où Select Instruction attribue une valeur à une variable. Je soupçonne que de telles instructions de sélection ne font pas une table en conséquence. Par exemple. Lorsque je veux mélanger l'affectation avec un nom de colonne comme dans: xxx

i Obtenir l'erreur suivante:

msg 141, niveau 15, état 1, ligne 4
Une instruction SELECT qui attribue une valeur à une variable ne doit pas être combinée à des opérations de récupération de données.

(suivant ce Course Sur internet avec Base de données )

Ma question est que s'il existe une autre forme de manipulation de données (comme une affectation) que dans une instruction SELECT ne produisent pas de table (si mon hypothèse est correcte).


7 commentaires

L'erreur vous dit le problème. Vous essayez d'attribuer la valeur de @Columns et renvoyer la valeur de catégorie_name . L'erreur, j'ai peur, ne peut pas être plus claire. Un Sélectionnez ne peut en faire qu'un, ou l'autre, mais pas tous les deux.


Je ne comprends pas votre question: S'il existe une autre forme de manipulation de données (comme une affectation) que dans une instruction SELECT ne produisent pas de table (si mon hypothèse est correcte). . Si vous avez pris catégorie_name de cette instruction, ce serait une sélection de la tâche et de ne pas produire de résultat


Stackoverflow.com/Questtions/3945361/... < / a>


Oui, tu as raison. Mais ma question est la suivante: "Est-ce qu'il existe une autre forme de manipulation de données (comme une affectation) que dans une instruction SELECT ne produisent pas de table (si mon hypothèse est correcte)."


Si vous souhaitez affecter toutes les valeurs en variable, la partie suivante du code vous aidera à vous aider; @Columns = String_agg (Nom de la catégorie, ';') au sein du groupe (commander par catégorie_name)


Ce n'est pas un bon "tutoriel" - plutôt, il semble que ce soit un groupe de sujets regroupés dans des sections qui ne vous guident pas réellement ou ne construisent pas les compétences dans une méthode pour encourager le succès. Trouve un autre. Un pivot est quelque chose que vous devriez partir jusqu'à votre maîtrise de base SQL. Ce que vous essayez de faire est un pivot dynamique qui est encore plus complexe. Et cet usage utilise un "truc" aux cordes agrégées découragées.


Quiconque a voté cela: veuillez garder à l'esprit que ceci est un nouveau contributeur et des États semblables à être novices avec le sujet. Voici quelqu'un qui essaie d'apprendre quelque chose. Aucune raison de mettre un vers le bas ... La question est claire et non stupide de quelque manière que ce soit. +1 de mon côté.


3 Réponses :


0
votes

Vous voulez convertir de la ligne à la colonne de ligne unique droite xxx


1 commentaires

Merci, c'est une solution rapide de la boîte.



1
votes

Pour répondre à votre question littéralement:

Quand sélectionnez-vous ne pas créer une table sous forme de sortie p> blockQuote>

jamais! p>

Le Sélectionnez CODE> renvoie un ensemble de résultats, composé de lignes et de chaque ligne constituée de colonnes. P>

Il y a Une situation spéciale, lorsque votre jeu de résultats revient avec exactement une ligne em> avec une seule colonne em>. Cela peut être pris comme une valeur scalaire forte> et est donc attribuée à une variable. P>

Vous pouvez appliquer une seule ligne avec un top 1 code> ou avec un où code> -crause qui garantit de retourner plus d'une ligne. Mais le moteur ne verra pas cela à l'avance. Votre code fourni mentionne deux colonnes, celle avec le quotename () code> et - après la virgule - une fois de plus le catégorie_name code>. C'est pourquoi vous obtenez l'exception. P>

C'est une situation similaire, lorsque vous souhaitez tester une liste, par exemple. Avec p> xxx pré>

la sélection dans le in () code> retourne une liste des valeurs d'identification, mais il n'y aura qu'une colonne. P>

Mettez à jour quelques astuces sur votre code ... H2>

Qu'est-ce que vous faites ici: P>

SELECT @columns=STRING_AGG(QUOTENAME(COLUMN_NAME),',')
FROM 
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='spt_fallback_db';

SELECT @columns;


1 commentaires

Merci pour la réponse, Shnugo. Cela m'a donné quelque chose à mâcher de la manière dont la manière dont les fonctions de sélection.



2
votes

Peu importe ce que vous faites, Sélectionnez retournera toujours une table.

Création d'une procédure stockée avec beaucoup de critères vous permet de renvoyer une table ou de retourner une variable. xxx

dans votre stockéProcoDureTest : xxx

résultat:

La sortie de stockéProcoDureTest est: this_is_input_abc


2 commentaires

Cela pourrait être une question de goût, mais c'est - dans mes yeux - un très mauvais conseil d'utiliser une procédure stockée pour cela. Le mieux était un inline TVF , que vous pouvez appliquer à votre requête. Ce speur vous oblige à Pensée procédurale , loin de la pensée bien meilleure basée sur le jeu ...


Votre réponse ne répond pas à la question réellement ... L'OP souhaite créer une liste concaténée de tous les valeurs Catégorie_name dans une table ... J'espère que vous ne suggérerez pas d'utiliser un curseur avec ce sp ...