我有一个数据库,其中架构是:
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)
Run Code Online (Sandbox Code Playgroud)
所以查询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'
Run Code Online (Sandbox Code Playgroud)
COLUMN_NAME |
---|
ID |
姓名 |
标记 |
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Student'
Run Code Online (Sandbox Code Playgroud)
ID | 姓名 | 标记 |
---|---|---|
ID | ||
姓名 | ||
标记 |
但我希望它们像这样排成一排:
ID | 姓名 | 标记 |
---|---|---|
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'
Run Code Online (Sandbox Code Playgroud)
我知道这不是正确的做法,但是我该怎么做呢?
我想从 SSMS 网格复制查询结果,但不想使用带标头复制的选项。看起来没什么用,但我想挑战自己去做。
在 T-SQL 中完全通用地执行您想要的操作非常困难,但这适用于以下示例:
DECLARE
@Query nvarchar(max),
@ExtraRow nvarchar(max);
SET @Query = N'SELECT * FROM dbo.Student;'
SELECT @ExtraRow = STRING_AGG
(
CONCAT
(
CONVERT(nvarchar(max), NCHAR(13)),
QUOTENAME(RS.[name]),
N' = CONVERT(sql_variant, N',
QUOTENAME(RS.[name], NCHAR(39)),
N')'
),
N','
)
WITHIN GROUP (ORDER BY RS.column_ordinal)
FROM sys.dm_exec_describe_first_result_set(@Query, NULL, NULL) AS RS;
SET @Query = CONCAT
(
N'SELECT ',
@ExtraRow,
NCHAR(13),
N'UNION ALL',
NCHAR(13),
@Query
);
PRINT @Query;
EXECUTE (@Query);
Run Code Online (Sandbox Code Playgroud)
生成的动态SQL为:
DECLARE
@Query nvarchar(max),
@ExtraRow nvarchar(max);
SET @Query = N'SELECT * FROM dbo.Student;'
SELECT @ExtraRow = STRING_AGG
(
CONCAT
(
CONVERT(nvarchar(max), NCHAR(13)),
QUOTENAME(RS.[name]),
N' = CONVERT(sql_variant, N',
QUOTENAME(RS.[name], NCHAR(39)),
N')'
),
N','
)
WITHIN GROUP (ORDER BY RS.column_ordinal)
FROM sys.dm_exec_describe_first_result_set(@Query, NULL, NULL) AS RS;
SET @Query = CONCAT
(
N'SELECT ',
@ExtraRow,
NCHAR(13),
N'UNION ALL',
NCHAR(13),
@Query
);
PRINT @Query;
EXECUTE (@Query);
Run Code Online (Sandbox Code Playgroud)
抛开编码挑战不谈,您可以将 SSMS 设置为始终复制选项中的标头:
或者,有时要复制或不复制标题,请使用键盘快捷键或网格上下文菜单:
归档时间: |
|
查看次数: |
743 次 |
最近记录: |