如何在SQL中为结果集中的每一行选择额外的行?

如何在SQL中为结果集中的每一行选择额外的行?,sql,sql-server,Sql,Sql Server,我有以下疑问: SELECT '['+name+']' FROM sys.schemas Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA' .... 此查询的结果很简单: 我需要在每条记录后额外添加一行文字“GO”,如下所示: 有办法做到这一点吗?我尝试使用foreach语句,但无法复制所需的结果。可以使用UNION ALL填充这些额外值,并使用ORDER by子

我有以下疑问:

SELECT '['+name+']' FROM sys.schemas
Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA'
....
此查询的结果很简单:

我需要在每条记录后额外添加一行文字“GO”,如下所示:

有办法做到这一点吗?我尝试使用foreach语句,但无法复制所需的结果。

可以使用UNION ALL填充这些额外值,并使用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

只需按ENTER键将Go语句添加到动态代码中,即可在SSMS中看到粘贴结果。这将在下一行填充GO语句

您还应该使用QUOTENAME,而不是自己连接方括号,以便正确处理包含]的名称,并且可以使用NOT IN简化where子句


下面是交叉应用值的另一种方法

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) 
保证订单

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

比如说:

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

如果您只希望回车并在每一行后面走,您可以将其放在选择框中:


这并不完全是您所要求的,但它可能满足您的需要。

新行在专栏中明确指出:

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;
对于SQL2008+我们也可以使用CONCAT而不是+


OP已经明确提到我需要的是在每个记录后加上一行文字“GO”,请花一些时间阅读问题。这个答案不能满足OP的要求。在最后OP需要执行动态语句。事实上,他要求增加新的记录。但目的是将其分成一批。“建议一个正确的方法不是一个坏主意。”吉宾巴拉昌德拉尼已经阅读了所有的问题,我明白他需要将结果分成一个批处理语句。当这个小的解决方案在做工作时,他为什么需要去寻找复杂的解决方案。希望你能理解我的想法,建议他@JibinBalachandran@ShakeerMirza好的,对不起。。我错了,我为此道歉+1从我这边。您可能需要像Sagi didI那样指定订单。我目前不在计算机附近,但我认为交叉申请不需要sort@TheGameiswar-是的。正如预期的那样,不需要排序排序最终不保证排序output@TheGameiswar-我假设我们将进行讨论,虽然我打算接受您的观点,但您应该注意,所需的排序不在整个结果集中,而是在每个交叉应用结果集中,这取决于值的决定论。需要ORDER BY,以便GO行交错。工作完美,感谢您的回答。!最好从sys.schemas中编写SELECT quotename…@shakermirza答案应该被接受。@DuduMarkovitz当我读到Gordon Linoff答案时,我突然想到了这一点。!这一个比所有其他答案都简单。我的答案使用sqlite语法,指的是“rowid”,即行号。这在您使用的SQL方言中可能不可用,但您可以使用自己生成的行号创建一个临时表,并使用我的方法;它在任何情况下都有效,@ahmed abdelqader:通过您的编辑,将“rowid”更改为“schema_id”,我的答案现在不仅不兼容,而且毫无意义;有了你的更改,它就不起作用了。@ahmed abdelqader:我已经撤销了你的编辑;请看前面的评论。这与@sagi的回答基本相同;但是这个答案更完整,并且使用与OP相同的SQL方言。
SELECT '[' + name + ']
GO'
FROM sys.schemas 
Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA' 
....
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;
SELECT CONCAT('[', name ,'] GO ')
FROM sys.schemas 
WHERE name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA';