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:
J'ai besoin d'une ligne supplémentaire avec le text 'GO' après chaque logging comme ceci:
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