如何将表格的列排成一行?

XMe*_*i01 2 sql-server ssms

我有一个数据库,其中架构是:

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 网格复制查询结果,但不想使用带标头复制的选项。看起来没什么用,但我想挑战自己去做。

Pau*_*ite 6

在 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)

db<>小提琴演示

抛开编码挑战不谈,您可以将 SSMS 设置为始终复制选项中的标头:

SSMS 选项

或者,有时要复制或不复制标题,请使用键盘快捷键或网格上下文菜单:

网格上下文菜单