如何在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';