MSSQL:以文本形式输出时截断nvarchar(max)

时间:2017-05-22 07:05:06

标签: sql sql-server tsql

在我运行查询时的MSSQL上,当以Results To Text:

运行时,我得到以下输出
Description                                                                                                                                                                                                                                                      Another Column
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------
This is a Description                                                                                                                                                                                                                                            43289

但有趣的是,字符串末尾没有任何空白,长度也是正确的(没有任何空白)

我希望得到这样的输出:

Description    Another Column
-------------- --------------
My description 543893                                                                                                                                                                                                                                

我已经尝试rtrimltrimreplace,但没有一个正在运作。数据类型为nvarchar(max)

3 个答案:

答案 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];

我希望这对您有帮助,尽管这样做有点冗长。