268

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.

1

11 Answers 11

292

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").

11
  • 26
    Right-click, save as, to CSV worked for me like a charm to get a huge text value out of an NTEXT field. Commented May 28, 2015 at 22:27
  • 3
    @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
    – Eric
    Commented Jan 15, 2016 at 21:22
  • 11
    But do not open it in Excel, the CSV import will truncate the data again. :)
    – Johncl
    Commented Feb 24, 2017 at 9:08
  • 7
    Saving as tab delimited text works better. The csv format doubles all the quotes in the text. Commented Mar 22, 2018 at 14:20
  • 4
    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.
    – galmok
    Commented Mar 28, 2019 at 18:06
204

Quick trick-

SELECT CAST('<A><![CDATA[' + CAST(LogInfo as nvarchar(max)) + ']]></A>' AS xml)
FROM Logs
WHERE IDLog = 904862629
6
  • 9
    This works perfectly (without the CDATA part) when the contents of the column is actually XML
    – axk
    Commented Sep 16, 2016 at 11:31
  • 2
    This worked for me as well, I had json data that I needed to get out of ms sql.
    – Dev_Corps
    Commented Mar 23, 2017 at 13:20
  • 1
    Also, the contents are XML escaped. Once you take the text out, you should unescape it using a tool like freeformatter.com.
    – harsimranb
    Commented Jun 29, 2017 at 0:02
  • This worked for me: ``` DECLARE @g geography; ... select Cast(@g.ToString() as xml); ``` Commented Aug 7, 2017 at 17:26
  • 1
    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. +!
    – Yogi
    Commented May 25, 2019 at 16:21
145

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

enter image description here


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.

12
  • 2
    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. Commented Aug 10, 2012 at 8:43
  • 15
    @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. Commented Aug 10, 2012 at 9:10
  • 13
    Only works if the number of characters < 65535, which is a long way short of the ntext maximum.
    – Polyfun
    Commented Jan 13, 2015 at 15:17
  • 1
    @IvanG even 'Result to File' suffers from this limit.
    – Iain
    Commented Jan 5, 2016 at 23:58
  • 5
    Limit is much higher in latest version of SSMS. Good solution!
    – FDM
    Commented Mar 11, 2020 at 9:25
58

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:

http://www.ssmsboost.com/Features/ssms-add-in-copy-results-grid-cell-contents-line-with-breaksCopy original cell contents

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

(feature allows to open contents of field in any external application, so if you know that it is text - you use text editor to open it. If contents is binary data with picture - you select view as picture. Sample below shows opening a picture):SSMS Results grid visualizers

13
  • 4
    Looks like a really useful extension, but I cannot accept it as an answer as it requires a commercial product (or trial). Thanks though!
    – NickG
    Commented Aug 10, 2012 at 12:38
  • 4
    +1 Nice free extension that works perfectly... Thanks!
    – reSPAWNed
    Commented Mar 21, 2014 at 13:43
  • 2
    I know links to software are considered as bad answers due to the potential of it disappearing, but this is a very quick to setup solution to a problem which has not been answered by changing settings alone.
    – Radderz
    Commented Oct 21, 2015 at 13:44
  • 11
    Unfortunately, as of Sept 4, 2017, SSMS Boost is no longer free (except for a 30 day trial for each new version released)
    – csrowell
    Commented Oct 20, 2017 at 14:13
  • 10
    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. Commented Jan 8, 2019 at 7:25
13

Return data as XML

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

Make sure you set a reasonable limit in the SSMS options window, depending on the result you're expecting. enter image description here

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.

1
7

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')
1
  • 1
    Very simple and effective solution. Commented Nov 3, 2021 at 15:11
4

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.

2

Use the Visual Studio Code SQL Server Plugin. It is useful for JSON.

1

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!

0

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

1
  • copy/paste truncates data. Only the “Save Results As…” option works correctly
    – binki
    Commented Sep 28, 2021 at 20:12
-3

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

declare @t varchar(max)

select @t = long_column from table

print @t
3
  • 11
    But text is still truncated :-(
    – Rasmus
    Commented Nov 9, 2018 at 9:12
  • Yeaaah, still truncated :(
    – mkEagles
    Commented Aug 2, 2021 at 8:47
  • 1
    instead of pirnt @t do select @t and you can copy the full text from SSMS output window into word.
    – clamchoda
    Commented Apr 8, 2022 at 19:28

Not the answer you're looking for? Browse other questions tagged or ask your own question.