[英]MSSQL: Truncate nvarchar(max) when outputted as text
在 MSSQL 上运行查询时,作为Results To Text:
运行时得到以下输出Results To Text:
Description Another Column
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------
This is a Description 43289
但有趣的是,字符串的末尾根本没有任何空格,并且长度也是正确的(没有任何空格)
我想要这样的输出:
Description Another Column
-------------- --------------
My description 543893
我试过rtrim
、 ltrim
、 replace
,但都没有工作。 数据类型是nvarchar(max)
。
正如我所说,如果你真的需要这样做,你必须对数据进行两次传递:
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例如,其中一行可能有包含莎士比亚全集的description
,原始克林贡语。
尝试这个
select Description,len(rtrim(Description)) as count from table
编辑
实际问题是您将结果模式设置为文本。 将其更改为网格模式。 你会得到正确的结果
我知道这很旧,但对于将来可能需要它的任何人(包括我自己的记忆力有多差)。
我遇到了同样的问题。 这是我想出的解决方案:
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];
我希望你觉得这很有帮助,尽管这样做有点冗长。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.