Comment puis-je sélectionner une ligne supplémentaire pour chaque ligne dans le jeu de résultats dans SQL?

J'ai la requête ci-dessous:

SELECT '['+name+']' FROM sys.schemas Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA' .... 

Le résultat de cette requête est simple:

Entrez la description de l'image ici

J'ai besoin d'une ligne supplémentaire avec le text 'GO' après chaque logging comme ceci:

Entrez la description de l'image ici

Y a-t-il un moyen de faire cela? J'ai essayé avec une déclaration foreach , mais je ne pouvais pas reproduire les résultats souhaités.

Si vous voulez juste des returns chariot et "GO" après chaque ligne, vous pouvez le mettre dans le SELECT :

 SELECT '[' + name + '] GO' FROM sys.schemas Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA' .... 

Ce n'est pas exactement ce que vous requestz, mais cela pourrait faire ce dont vous avez besoin.

Ajoutez simplement l'instruction Go au code dynamic en appuyant sur la touche ENTRÉE et consultez le résultat collé dans SSMS. Cela va remplir avec l'instruction GO dans la ligne suivante.

Vous devez également utiliser QUOTENAME plutôt que de concaténer les crochets vous-même (pour que les noms contiennent correctement) et la clause where peut être simplifiée avec NOT IN .

 SELECT QUOTENAME(name) +' GO ' FROM sys.schemas WHERE name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA') 

Vous pouvez le faire en utilisant UNION ALL pour remplir ces valeurs supplémentaires et l'utilisation CASE EXPRESSION dans la clause ORDER BY pour cet ordre spécifique:

 SELECT t.name_col FROM( SELECT '['+name+']' as name_col,'['+name+']' as ord_col FROM sys.schemas Where name NOT IN('dbo','guest','INFORMATION_SCHEMA') UNION ALL SELECT 'GO','['+name+']' as ord_col FROM sys.schemas Where name NOT IN('dbo','guest','INFORMATION_SCHEMA')) t ORDER BY t.ord_col, CASE WHEN t.name_col = 'GO' THEN 1 ELSE 0 END 
 select c.txt from sys.schemas cross apply (values ('['+name+']'),('GO')) c(txt) where name not in ('dbo','guest','INFORMATION_SCHEMA') 

Commande garantie

 select c.txt from sys.schemas s cross apply (values ('['+name+']',1),('GO',2)) c(txt,ord) where s.name not in ('dbo','guest','INFORMATION_SCHEMA') order by s.name,c.ord 

Voici une autre façon d'appliquer des valeurs croisées

 SELECT B.* FROM (SELECT '[' + NAME + ']' AS NAME1, 'GO' AS GO1 FROM SYS.SCHEMAS WHERE NAME NOT IN ( 'DBO', 'GUEST', 'INFORMATION_SCHEMA' ))A CROSS APPLY ( VALUES(NAME1), (GO1) ) B(NAME1) 

Newline explicitement dans la colonne:

 SELECT QUOTENAME(name)+CHAR(10)+CHAR(13)+'GO' FROM sys.schemas WHERE name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA'; 

Newline dans une nouvelle ligne:

 SELECT lot FROM ( SELECT name=CAST(QUOTENAME(name) AS VARCHAR(256)),extra_line=CAST('GO' AS VARCHAR(256)) FROM sys.schemas WHERE name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA' ) as p UNPIVOT(lot FOR l IN (name,extra_line)) AS up; 

Nous pouvons également utiliser CONCAT au lieu de + pour SQL2008+

 SELECT CONCAT('[', name ,'] GO ') FROM sys.schemas WHERE name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA'; 

Que diriez-vous de quelque chose comme:

 select name from ( SELECT 2 * rowid as r, '['+name+']' as name FROM sys.schemas union select 2 * rowid + 1, 'GO' FROM sys.schemas )s order by r