有没有办法 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外添加一个新的列并填充它时,我需要在不移动Horizontal 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" 键。
之后你将在列的末尾。
不久,
我不是指的是最后 5 行。通过 SELECT TOP 5 * FROM Table Order By Key DESC
但我指的是“结果”选项卡中的最后 5 列。
为什么?因为我每次在SQL-Server外添加一个新的列并填充它时,我需要在不移动Horizontal 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" 键。 之后你将在列的末尾。