Как выбрать дополнительную строку для каждой строки в наборе результатов в SQL?
У меня есть следующий запрос:
SELECT '['+name+']' FROM sys.schemas
Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA'
....
Результат этого запроса прост:
![Введите описание изображения здесь]()
Мне нужна дополнительная строка с текстом "GO" после каждой записи вроде этого:
![Введите описание изображения здесь]()
Есть ли способ сделать это? Я попытался с помощью оператора foreach
, но мне не удалось выполнить репликацию желаемых результатов.
Ответы
Ответ 1
Если вы просто хотите вернуть карету и "GO" после каждой строки, вы можете поместить ее в SELECT
:
SELECT '[' + name + ']
GO'
FROM sys.schemas
Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA'
....
Это не совсем то, о чем вы просите, но оно может сделать то, что вам нужно.
Ответ 2
Просто добавьте оператор Go в динамический код, нажав клавишу ENTER и просмотрите вставку результатов в SSMS. Это будет заполнено оператором GO
в следующей строке.
Вы также должны использовать QUOTENAME, а не конкатенировать квадратные скобки (правильно работать для имен, содержащих ]
), а предложение where может быть упрощено с помощью NOT IN
.
SELECT QUOTENAME(name) +'
GO
'
FROM sys.schemas
WHERE name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA')
Ответ 3
Вы можете сделать это, используя UNION ALL
, чтобы заполнить эти дополнительные значения, и использовать CASE EXPRESSION
в предложении ORDER BY
для этого конкретного порядка:
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
Ответ 4
select c.txt
from sys.schemas cross apply (values ('['+name+']'),('GO')) c(txt)
where name not in ('dbo','guest','INFORMATION_SCHEMA')
Гарантированный заказ
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
Ответ 5
Вот еще один способ использования значений cross apply
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)
Ответ 6
Новая строка явно внутри столбца:
SELECT QUOTENAME(name)+CHAR(10)+CHAR(13)+'GO'
FROM sys.schemas
WHERE name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA';
Новая строка в новой строке:
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;
Ответ 7
Как насчет чего-то типа:
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
Ответ 8
Мы можем использовать CONCAT
также вместо +
для SQL2008+
SELECT CONCAT('[', name ,'] GO ')
FROM sys.schemas
WHERE name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA';