Sql server 是否有方法选择SQL Server结果选项卡中的最后N列?
很快, 我不是说最后5行。通过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
从表顺序中按键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,@devetonXML PATH(“”)
用于聚合字符串(列名)。如果您使用SQL Server 2017,STRING_AGG()
将更合适。因为您使用的是SQL Server 2014,而不是2017,@devetonXML 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
列,但它确实附带了学习曲线和