Sql server 是否有方法选择SQL Server结果选项卡中的最后N列?

Sql server 是否有方法选择SQL Server结果选项卡中的最后N列?,sql-server,ssms,sql-server-2014,ssms-2014,Sql Server,Ssms,Sql Server 2014,Ssms 2014,很快, 我不是说最后5行。通过从表顺序中按键DESC选择前5个* 但我指的是“结果”选项卡中的最后5列 为什么??因为每次我添加一个新列并在SQL Server外部填充它时,我都需要在不移动水平滚动的情况下查看其结果。许多列的开头都有相同的名称 这不是编码问题。但这与SQLServerIDE结果选项卡本身有关 我找了很多次。但我想这件事从来没有问过。所以我 我们需要一种方法来解决这个问题。我假设类似于内置函数 或者任何人都知道的事情 基于系统目录视图的动态语句可能有助于: DECLARE @ta

很快,

我不是说最后5行。通过
从表顺序中按键DESC选择前5个*

但我指的是“结果”选项卡中的最后5列

为什么??因为每次我添加一个新列并在SQL Server外部填充它时,我都需要在不移动水平滚动的情况下查看其结果。许多列的开头都有相同的名称

这不是编码问题。但这与SQLServerIDE结果选项卡本身有关

我找了很多次。但我想这件事从来没有问过。所以我 我们需要一种方法来解决这个问题。我假设类似于内置函数 或者任何人都知道的事情


基于系统目录视图的动态语句可能有助于:

DECLARE @tablename sysname = 'table'
DECLARE @schemaname sysname = 'dbo'
DECLARE @stm nvarchar(max) 

SELECT @stm = (
    SELECT TOP(5) CONCAT(@stm, N',', col.[name])
    FROM sys.columns col
    JOIN sys.tables tab ON col.object_id = tab.object_id
    JOIN sys.schemas sch ON tab.schema_id = sch.schema_id
    WHERE 
        tab.[name] = @tablename AND 
        sch.[name] = @schemaname
    ORDER BY col.column_id DESC
    FOR XML PATH('')
)
SELECT @stm = CONCAT(
    N'SELECT ',
    STUFF(@stm, 1, 1, N''),
    N' FROM ',
    QUOTENAME(@schemaname),
    N'.',
    QUOTENAME(@tablename)
)

PRINT @stm
EXEC sp_executesql @stm

基于系统目录视图的动态语句可能有助于:

DECLARE @tablename sysname = 'table'
DECLARE @schemaname sysname = 'dbo'
DECLARE @stm nvarchar(max) 

SELECT @stm = (
    SELECT TOP(5) CONCAT(@stm, N',', col.[name])
    FROM sys.columns col
    JOIN sys.tables tab ON col.object_id = tab.object_id
    JOIN sys.schemas sch ON tab.schema_id = sch.schema_id
    WHERE 
        tab.[name] = @tablename AND 
        sch.[name] = @schemaname
    ORDER BY col.column_id DESC
    FOR XML PATH('')
)
SELECT @stm = CONCAT(
    N'SELECT ',
    STUFF(@stm, 1, 1, N''),
    N' FROM ',
    QUOTENAME(@schemaname),
    N'.',
    QUOTENAME(@tablename)
)

PRINT @stm
EXEC sp_executesql @stm

好的,Deveton,正如前面所解释的,这需要一个动态SQL

我想下面可以回答你的问题:

declare @columns    varchar(max)
,       @sql        varchar(max)
,       @tblname    varchar(20)     =   'Settings'

select @columns = stuff((select top 5 ',' + quotename(column_name)
            from information_schema.columns
            where table_name = @tblname
            order by ordinal_position desc
            for xml path(''), type).value('.', 'nvarchar(max)'),1,1,'')

set @sql = 'select '+@columns+' from '+quotename(@tblname)
exec (@sql)
请告知它是否适合您

编辑

我还添加了按标识列降序指定前200名和顺序的功能:

declare @columns    varchar(max)
,       @sql        varchar(max)
,       @tblname    varchar(20)     =   '_btblInvoiceLines'

declare @idcolumn   varchar(max)    =   quotename((select column_name from information_schema.columns where table_name = @tblname and COLUMNPROPERTY(object_id(TABLE_SCHEMA+'.'+TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1))

select @columns = stuff((select top 5 ',' + quotename(column_name)
            from information_schema.columns
            where table_name = @tblname
            order by ordinal_position desc
            for xml path(''), type).value('.', 'nvarchar(max)'),1,1,'')

set @sql = 'select top 200'+@columns+' from '+quotename(@tblname)+' order by '+@idcolumn+' desc'
print(@sql)
exec (@sql)

好的,Deveton,正如前面所解释的,这需要一个动态SQL

我想下面可以回答你的问题:

declare @columns    varchar(max)
,       @sql        varchar(max)
,       @tblname    varchar(20)     =   'Settings'

select @columns = stuff((select top 5 ',' + quotename(column_name)
            from information_schema.columns
            where table_name = @tblname
            order by ordinal_position desc
            for xml path(''), type).value('.', 'nvarchar(max)'),1,1,'')

set @sql = 'select '+@columns+' from '+quotename(@tblname)
exec (@sql)
请告知它是否适合您

编辑

我还添加了按标识列降序指定前200名和顺序的功能:

declare @columns    varchar(max)
,       @sql        varchar(max)
,       @tblname    varchar(20)     =   '_btblInvoiceLines'

declare @idcolumn   varchar(max)    =   quotename((select column_name from information_schema.columns where table_name = @tblname and COLUMNPROPERTY(object_id(TABLE_SCHEMA+'.'+TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1))

select @columns = stuff((select top 5 ',' + quotename(column_name)
            from information_schema.columns
            where table_name = @tblname
            order by ordinal_position desc
            for xml path(''), type).value('.', 'nvarchar(max)'),1,1,'')

set @sql = 'select top 200'+@columns+' from '+quotename(@tblname)+' order by '+@idcolumn+' desc'
print(@sql)
exec (@sql)

正如我在评论中提到的,如果表的定义不断变化,这表明数据库中存在更大的设计缺陷。对象定义应该是相当静态的,并且它们绝对不应该在每次连接到实例时都发生更改。这是问题的根本原因,而不是键入5列的名称而不是使用
*
太难

这意味着修复您的设计,我们无法对此发表评论,但我建议这是您下一步要做的主要步骤。规范化您的设计,并使用多个表(因为我怀疑由于缺乏规范化,您每次都会添加额外的列)

在此期间,您可以使用动态SQL:

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

DECLARE @Schema sysname = N'dbo',
        @Table sysname = N'rCTE_Vs_Tally';

SET @SQL = N'SELECT ' +
           STUFF((SELECT TOP(5)
                         N',' + @CRLF + 
                         N'       ' + QUOTENAME(c.[name])
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                  WHERE s.[name] = @Schema
                    AND t.[name] = @Table
                  ORDER BY C.column_id DESC
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,10,'') + @CRLF + 
          N'FROM ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + @CRLF + 
          N'ORDER BY [Key] DESC;' --Assumes all tables have the column Key
PRINT @SQL;


EXEC sp_executesql @SQL;

正如我在评论中提到的,如果表的定义不断变化,这表明数据库中存在更大的设计缺陷。对象定义应该是相当静态的,并且它们绝对不应该在每次连接到实例时都发生更改。这是问题的根本原因,而不是键入5列的名称而不是使用
*
太难

这意味着修复您的设计,我们无法对此发表评论,但我建议这是您下一步要做的主要步骤。规范化您的设计,并使用多个表(因为我怀疑由于缺乏规范化,您每次都会添加额外的列)

在此期间,您可以使用动态SQL:

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

DECLARE @Schema sysname = N'dbo',
        @Table sysname = N'rCTE_Vs_Tally';

SET @SQL = N'SELECT ' +
           STUFF((SELECT TOP(5)
                         N',' + @CRLF + 
                         N'       ' + QUOTENAME(c.[name])
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                  WHERE s.[name] = @Schema
                    AND t.[name] = @Table
                  ORDER BY C.column_id DESC
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,10,'') + @CRLF + 
          N'FROM ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + @CRLF + 
          N'ORDER BY [Key] DESC;' --Assumes all tables have the column Key
PRINT @SQL;


EXEC sp_executesql @SQL;
在“结果”选项卡中,只需按“结束”键。 之后,您将位于列的末尾。

在“结果”选项卡中,只需按“结束”键即可。

之后,您将位于列的末尾。

不,这是不可能的。请不要使用
*
并在
中定义列的名称,而是选择
。您确定吗?我是否应该立即删除问题--键入要查看的列的名称。这有多困难?我爱你,德弗顿。为什么您的表格定义不断变化。。。?特定对象的定义应该是静态的;如果每次连接到服务器时它都在更改,这意味着一个更大的设计问题。不,这是不可能的。请不要使用
*
,而是在
选择中定义列的名称。是否确定?我是否应该立即删除问题--键入要查看的列的名称。这有多困难?我爱你,德弗顿。为什么您的表格定义不断变化。。。?特定对象的定义应该是静态的;如果每次连接到服务器时它都在变化,那就意味着一个更大的设计问题。而且有效。所以现在把它存储在存储过程中,参数需要取表名,它比下面的答案要短。而且有效。因此,现在将其存储在存储过程和参数中需要使用表名,因为您使用的是SQL Server 2014,而不是2017,@deveton
XML PATH(“”)
用于聚合字符串(列名)。如果您使用SQL Server 2017,
STRING_AGG()
将更合适。因为您使用的是SQL Server 2014,而不是2017,@deveton
XML PATH(“”)
在此处用于聚合字符串(列名)。如果使用SQL Server 2017,
STRING_AGG()
将更合适。idk,为什么所有答案都包含FOR XML PATH(我一点也不生气,@deveton,我只是告诉你事情的真相。如果你真的想要这个功能,你可以在官方的SQL Server论坛上询问。它可能会被添加到SQL Server的未来版本中,但恐怕在2014年肯定不会被添加;现在只在扩展支持中。听起来不应该这样每次都是一个新列,@deveton。您应该在表中添加一个新行;该行有2(+)列。
SettingName
列和
SettingValue
列(以及其他相关列)。考虑到您想知道“最新”设置,请输入日期(时间)列也可能是一个好主意。如果您的设置永远不会扩展,那么您的设计就不会有问题,但事实上它们是这样的,这意味着您应该构建高的,而不是宽的。LARNU,每个设置都有自定义数据类型,因此添加新行将具有相同类型的列。然后您需要巩固设置或使用动态SQL为了实现您的目标(因为这是唯一的方法)。您可以(这不是推荐,只是说您可以)使用
sql\u variant
列,但它确实附带了学习曲线和