[英]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.