Подтвердить что ты не робот

Как выбрать дополнительную строку для каждой строки в наборе результатов в SQL?

У меня есть следующий запрос:

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

Результат этого запроса прост:

Введите описание изображения здесь

Мне нужна дополнительная строка с текстом "GO" после каждой записи вроде этого:

Введите описание изображения здесь

Есть ли способ сделать это? Я попытался с помощью оператора foreach, но мне не удалось выполнить репликацию желаемых результатов.

4b9b3361

Ответ 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';