我有一个数据库,其中架构是:
CREATE TABLE [dbo].[Student]([Id] [int] NULL,[Name] [varchar](255) NULL,[Mark] [int] NULL)
INSERT [dbo].[Student] ([Id], [Name], [Mark]) VALUES (1, N'Medi', 10)
INSERT [dbo].[Student] ([Id], [Name], [Mark]) VALUES (2, N'Ibra', 15)
INSERT [dbo].[Student] ([Id], [Name], [Mark]) VALUES (3, N'Simo', 20)
所以查询select * from Student
:
ID | 姓名 | 标记 |
---|---|---|
1 | 医疗 | 10 |
2 | 伊布拉 | 15 |
3 | 西莫 | 20 |
但我想要第一行的标题是这样的:
ID | 姓名 | 标记 |
---|---|---|
ID | 姓名 | 标记 |
1 | 医疗 | 10 |
2 | 伊布拉 | 15 |
3 | 西莫 | 20 |
为了建立这个结果,
- 首先,我想获取列:
我已经用INFORMATION_SCHEMA
查询完成了这个:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Student'
COLUMN_NAME |
---|
ID |
姓名 |
标记 |
SELECT IIF(COLUMN_NAME='Id',COLUMN_NAME,'')Id,IIF(COLUMN_NAME='Name',COLUMN_NAME,'')Name,IIF(COLUMN_NAME='Mark',COLUMN_NAME,'') Mark
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Student'
ID | 姓名 | 标记 |
---|---|---|
ID | ||
姓名 | ||
标记 |
但我希望它们像这样排成一行:
ID | 姓名 | 标记 |
---|---|---|
ID | 姓名 | 标记 |
with cte as(
SELECT IIF(COLUMN_NAME='Id',COLUMN_NAME,'')Id,IIF(COLUMN_NAME='Name',COLUMN_NAME,'')Name,IIF(COLUMN_NAME='Mark',COLUMN_NAME,'') Mark
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Student'
)
select * from cte where id!=''
union
select * from cte where Name!=''
union
select * from cte where Mark!=''
我知道这不是正确的做法,但是我该怎么做呢?
我想从 SSMS 网格复制查询结果,但我不想使用带有标题的复制选项。看起来没什么用,但我想挑战自己去做。
在 T-SQL 中完全通用地做你想做的事情是非常困难的,但这适用于这个例子:
生成的动态 SQL 为:
db<>小提琴演示
除了编码挑战,您可以将 SSMS 设置为始终复制选项中的标题:
或者,有时要复制或不复制标题,请使用键盘快捷键或网格上下文菜单: