有没有办法 select SQL 服务器结果选项卡中的最后 N 列?

Is there a way to select last N columns in SQL Server Results Tab?

不久,

我不是指的是最后 5 行。通过 SELECT TOP 5 * FROM Table Order By Key DESC

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

为什么?因为我每次在SQL-Server外添加一个新的列并填充它时,我需要在不移动Horizo​​ntal Scroll的情况下看到它的结果。许多列在开头具有相同的名称。

这不是编码问题。但它与 SQL-服务器 IDE 结果选项卡本身有关。

I Searched many times. but this thing never asked I think. so please I want an approach for that. I assume something like built-in function or something anyone knows

基于系统目录视图的动态语句可能对此处有所帮助:

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)

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

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

在此期间,您可以使用动态 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;

当您在“结果”选项卡中时,只需按 "End" 键。 之后你将在列的末尾。