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

Anu*_*nup 20 sql sql-server

我有以下查询:

SELECT '['+name+']' FROM sys.schemas
Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA'
....
Run Code Online (Sandbox Code Playgroud)

此查询的结果很简单:

在此输入图像描述

在这样的每条记录之后我需要一个带有文本'GO'的额外行:

在此输入图像描述

有没有办法做到这一点?我尝试了一个foreach声明,但我无法复制所需的结果.

Sha*_*rza 24

只需按Enter键将Go语句添加到动态代码中,然后在SSMS中查看粘贴的结果.这将填充GO下一行中的语句.

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

SELECT QUOTENAME(name) +'
GO
' 
FROM sys.schemas 
WHERE name NOT IN  ('dbo', 'guest', 'INFORMATION_SCHEMA') 
Run Code Online (Sandbox Code Playgroud)


sag*_*agi 13

您可以通过使用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
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 12

如果你只想要回车并在每一行之后"GO",你可以把它放在SELECT:

SELECT '[' + name + ']
GO'
FROM sys.schemas 
Where name <> 'dbo' AND name <> 'guest' AND name <> 'INFORMATION_SCHEMA' 
....
Run Code Online (Sandbox Code Playgroud)

这不是您要求的,但它可能会满足您的需求.

  • 这个解决方案已由@ShakeerMirza提供 (11认同)

Dav*_*itz 6

select  c.txt
from    sys.schemas cross apply (values ('['+name+']'),('GO')) c(txt)
where   name not in ('dbo','guest','INFORMATION_SCHEMA') 
Run Code Online (Sandbox Code Playgroud)

保证订单

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
Run Code Online (Sandbox Code Playgroud)