ChatGPT解决这个技术问题 Extra ChatGPT

How do you view ALL text from an ntext or nvarchar(max) in SSMS?

How do you view ALL text from an NTEXT or NVARCHAR(max) in SQL Server Management Studio? By default, it only seems to return the first few hundred characters (255?) but sometimes I just want a quick way of viewing the whole field, without having to write a program to do it. Even SSMS 2012 still has this problem :(


D
DeveloperDan

I was able to get the full text (99,208 chars) out of a NVARCHAR(MAX) column by selecting (Results To Grid) just that column and then right-clicking on it and then saving the result as a CSV file. To view the result open the CSV file with a text editor (NOT Excel). Funny enough, when I tried to run the same query, but having Results to File enabled, the output was truncated using the Results to Text limit.

The work-around that @MartinSmith described as a comment to the (currently) accepted answer didn't work for me (got an error when trying to view the full XML result complaining about "The '[' character, hexadecimal value 0x5B, cannot be included in a name").


Right-click, save as, to CSV worked for me like a charm to get a huge text value out of an NTEXT field.
@ajeh: which version of SSMS 2012 are you using? I just tested it (followed the same exact steps I described in my answer) with my SSMS 2012 (version 11.0.5343.0) and it works
But do not open it in Excel, the CSV import will truncate the data again. :)
Saving as tab delimited text works better. The csv format doubles all the quotes in the text.
Exporting as CSV ruins the JSON by adding double quotes. Exporting as TAB delimited ruins the JSON by inserting newlines after 2037 characters (apparently max line length). It does not seem possible to make SSMS to handover any JSON longer than approx 2000 characters.
i
iliketocode

Quick trick-

SELECT CAST('<A><![CDATA[' + CAST(LogInfo as nvarchar(max)) + ']]></A>' AS xml)
FROM Logs
WHERE IDLog = 904862629

This works perfectly (without the CDATA part) when the contents of the column is actually XML
This worked for me as well, I had json data that I needed to get out of ms sql.
Also, the contents are XML escaped. Once you take the text out, you should unescape it using a tool like freeformatter.com.
This worked for me: ``` DECLARE @g geography; ... select Cast(@g.ToString() as xml); ```
This worked for me with SSMS v18 to view 250kb json string which was truncated by other solutions. Plus I like it because it gives you a link to a text viewer. +!
E
Eugene Podskal

In newer versions of SSMS it can be configured in the (Query/Query Options/Results/Grid/Maximum Characters Retrieved) menu:

https://i.stack.imgur.com/9ZiYl.png

Old versions of SSMS

Options (Query Results/SQL Server/Results to Grid Page)

To change the options for the current queries, click Query Options on the Query menu, or right-click in the SQL Server Query window and select Query Options.

...

Maximum Characters Retrieved Enter a number from 1 through 65535 to specify the maximum number of characters that will be displayed in each cell.

Maximum is, as you see, 64k. The default is much smaller.

BTW Results to Text has even more drastic limitation:

Maximum number of characters displayed in each column This value defaults to 256. Increase this value to display larger result sets without truncation. The maximum value is 8,192.


As Remus wrote in his answer, there are limitations, because maximum storage size for data type in column defined with MAX is 2 GB so there has to be some limitation because it would be cumbersome to display all of that data in SSMS.
@IvanG - Not really. It could just be hyperlinked in the same way as XML is and clicking on it would open it in a new window. The work around I normally use is to cast it to XML as here. XML data can be set to allow unlimited length.
Only works if the number of characters < 65535, which is a long way short of the ntext maximum.
@IvanG even 'Result to File' suffers from this limit.
Limit is much higher in latest version of SSMS. Good solution!
A
Andrei Rantsevich

I have written an add-in for SSMS and this problem is fixed there. You can use one of 2 ways:

you can use "Copy current cell 1:1" to copy original cell data to clipboard:

https://i.stack.imgur.com/qCCAb.png

Or, alternatively, you can open cell contents in external text editor (notepad++ or notepad) using "Cell visualizers" feature: http://www.ssmsboost.com/Features/ssms-add-in-results-grid-visualizers

https://i.stack.imgur.com/cD9QP.png


Looks like a really useful extension, but I cannot accept it as an answer as it requires a commercial product (or trial). Thanks though!
+1 Nice free extension that works perfectly... Thanks!
Thanks, this does exactly what I want.
Unfortunately, as of Sept 4, 2017, SSMS Boost is no longer free (except for a 30 day trial for each new version released)
This is now a commercial product, the free license doesn't cover any of the mentioned features, they are disabled and you get a pop-up to buy the PRO version. The answer is just a promotion for his software.
d
dvlsc

Return data as XML

SELECT CONVERT(XML, [Data]) AS [Value]
FROM [dbo].[FormData]
WHERE [UID] LIKE '{my-uid}'

https://i.stack.imgur.com/FlA0z.jpg

This will work if the text you're returning doesn't contain unencoded characters like & instead of &amp; that will cause the XML conversion to fail.

Returning data using PowerShell

For this you will need the PowerShell SQL Server module installed on the machine on which you'll be running the command.

If you're all set up, configure and run the following script:

Invoke-Sqlcmd -Query "SELECT [Data] FROM [dbo].[FormData] WHERE [UID] LIKE '{my-uid}'" -ServerInstance "database-server-name" -Database "database-name" -Username "user" -Password "password" -MaxCharLength 10000000 | Out-File -filePath "C:\db_data.txt"

Make sure you set the -MaxCharLength parameter to a value that suits your needs.


The esiest way so far
t
takrl

I was successful with this method today. It's similar to the other answers in that it also converts the contents to XML, just using a different method. As I didn't see FOR XML PATH mentioned amongst the answers, I thought I'd add it for completeness:

SELECT [COL_NVARCHAR_MAX]
  FROM [SOME_TABLE]
  FOR XML PATH(''), ROOT('ROOT')

This will deliver a valid XML containing the contents of all rows, nested in an outer <ROOT></ROOT> element. The contents of the individual rows will each be contained within an element that, for this example, is called <COL_NVARCHAR_MAX>. The name of that can be changed using an alias via AS.

Special characters like &, < or > or similar will be converted to their respective entities. So you may have to convert &lt;, &gt; and &amp; back to their original character, depending on what you need to do with the result.

EDIT

I just realized that CDATA can be specified using FOR XML too. I find it a bit cumbersome though. This would do it:

SELECT 1 as tag, 0 as parent, [COL_NVARCHAR_MAX] as [COL_NVARCHAR_MAX!1!!CDATA]
  FROM [SOME_TABLE]
  FOR XML EXPLICIT, ROOT('ROOT')

Very simple and effective solution.
d
dana

PowerShell Alternative

This is an old post and I read through the answers. Still, I found it a bit too painful to output multi-line large text fields unaltered from SSMS. I ended up writing a small C# program for my needs, but got to thinking it could probably be done using the command line. Turns out, it is fairly easy to do so with PowerShell.

Start by installing the SqlServer module from an administrative PowerShell.

Install-Module -Name SqlServer

Use Invoke-Sqlcmd to run your query:

$Rows = Invoke-Sqlcmd -Query "select BigColumn from SomeTable where Id = 123" `
    -MaxCharLength 2147483647 -ConnectionString $ConnectionString

This will return an array of rows that you can output to the console as follows:

$Rows[0].BigColumn

Or output to a file as follows:

$Rows[0].BigColumn | Out-File -FilePath .\output.txt -Encoding UTF8

The result is a beautiful un-truncated text written to a file for viewing/editing. I am sure there is a similar command to save back the text to SQL Server, although that seems like a different question.

EDIT: It turns out that there was an answer by @dvlsc that described this approach as a secondary solution. I think because it was listed as a secondary answer, is the reason I missed it in the first place. I am going to leave my answer which focuses on the PowerShell approach, but wanted to at least give credit where it was due.


C
CDenby

If you only have to view it, I've used this:

print cast(dbo.f_functiondeliveringbigformattedtext(seed) as text)

The end result is that I get line feeds and all the content in the messages window of SMSS. Of course, it only allows for a single cell - if you want to do a single cell from a number of rows, you could do this:

declare @T varchar(max)=''
select @T=@T
       + isnull(dbo.f_functiondeliveringbigformattedtext(x.a),'NOTHINGFOUND!')
       + replicate(char(13),4)
from x -- table containing multiple rows and a value in column a
print @T

I use this to validate JSON strings generated by SQL code. Too hard to read otherwise!


r
roncansan

Use visual studio code with sql server plugin. Super usefull for jsons


D
Don G.

Alternative 1: Right Click to copy cell and Paste into Text Editor (hopefully with utf-8 support)

Alternative 2: Right click and export to CSV File

Alternative 3: Use SUBSTRING function to visualize parts of the column. Example:

SELECT SUBSTRING(fileXml,2200,200) FROM mytable WHERE id=123456


copy/paste truncates data. Only the “Save Results As…” option works correctly
c
cfnerd

The easiest way to quickly view large varchar/text column:

declare @t varchar(max)

select @t = long_column from table

print @t

But text is still truncated :-(
Yeaaah, still truncated :(
instead of pirnt @t do select @t and you can copy the full text from SSMS output window into word.

关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now