在我运行查询时的MSSQL上,当以Results To Text:
Description Another Column
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------
This is a Description 43289
但有趣的是,字符串末尾没有任何空白,长度也是正确的(没有任何空白)
我希望得到这样的输出:
Description Another Column
-------------- --------------
My description 543893
我已经尝试rtrim
,ltrim
,replace
,但没有一个正在运作。数据类型为nvarchar(max)
。
答案 0 :(得分:2)
正如我所说,如果你真的需要这样做,你必须对数据进行两次传递:
create table #t (description nvarchar(max),otherColumn int)
insert into #t(description,otherColumn) values
(N'Short Desc.',21),
(N'Loooooonnnnnngggggg Description',99)
declare @maxLength int
declare @sql nvarchar(max)
select @maxLength = MAX(LEN(description)) from #t
if @maxLength <= 4000
begin
set @sql = N'SELECT CONVERT(nvarchar(' + CONVERT(nvarchar(4),@maxLength) +
N'),description) as description'
end
else
begin
set @sql = N'SELECT description'
end
set @sql = @sql + N',otherColumn from #t'
exec sp_executesql @sql
结果:
description otherColumn
------------------------------- -----------
Short Desc. 21
Loooooonnnnnngggggg Description 99
即使您使用RTRIM
等,当系统编译查询时,它也不知道单个行 1中包含的数据的性质。因此,它只能将数据类型nvarchar(max)
指定为结果列的类型。
反过来,当SSMS开始接收结果集时,会通知该列是nvarchar(max)
。在它打印列标题时,它不知道它将接收的结果长度的性质,因此它必须采用合理的默认显示宽度,以应对收到的任何数据。
我通常将这种格式注意事项留给实际的表示层(例如报表生成器或应用程序),而不是摆弄并试图强制SQL / SMS进行这种格式化。
1 E.g。其中一行可能有description
,其中包含原始克林贡语中莎士比亚的全部作品。
答案 1 :(得分:0)
试试这个
select Description,len(rtrim(Description)) as count from table
修改
实际问题是您将结果模式设置为文本。将其更改为网格模式。您将获得正确的结果
答案 2 :(得分:0)
我知道这很旧,但对于将来可能需要它的任何人(包括我的记忆力有多差)。
我遇到了同样的问题。这是我想出的解决方案:
SELECT CASE
WHEN LEN([Description]) >= 20
THEN CAST((LEFT([Description], 17) + '...') AS VARCHAR(20))
ELSE CAST([Description] AS VARCHAR(20))
END AS [Description]
,[Another Column]
FROM [dbo].[YourTableName];
我希望这对您有帮助,尽管这样做有点冗长。