如何在SQL Server Management Studio中查看NTEXT或NVARCHAR(max)中的所有文本?默认情况下,它似乎只返回前几百个字符(255?),但有时我只是想要一种快速查看整个字段的方法,而不必编写程序来做到这一点。即使是SSMS 2012仍然存在这个问题:(
当前回答
如果你只需要查看它,我使用了这个:
print cast(dbo.f_functiondeliveringbigformattedtext(seed) as text)
最终的结果是,我得到换行和所有的内容在短信窗口的消息。 当然,它只允许一个单元格-如果你想从一些行中做一个单元格,你可以这样做:
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
我使用它来验证SQL代码生成的JSON字符串。否则太难读了!
其他回答
PowerShell替代
这是一个老帖子,我读了答案。尽管如此,我还是觉得从SSMS中输出未修改的多行大文本字段有点太痛苦了。最后我写了一个小的c#程序来满足我的需求,但是我想它可能可以用命令行来完成。事实证明,使用PowerShell可以相当容易地做到这一点。
首先从管理PowerShell安装SqlServer模块。
Install-Module -Name SqlServer
使用Invoke-Sqlcmd运行查询:
$Rows = Invoke-Sqlcmd -Query "select BigColumn from SomeTable where Id = 123" `
-MaxCharLength 2147483647 -ConnectionString $ConnectionString
这将返回一个行数组,你可以输出到控制台,如下所示:
$Rows[0].BigColumn
或输出到一个文件,如下所示:
$Rows[0].BigColumn | Out-File -FilePath .\output.txt -Encoding UTF8
结果是一个漂亮的未删节的文本写入文件以供查看/编辑。我相信有一个类似的命令保存回SQL Server的文本,虽然这似乎是一个不同的问题。
编辑:@dvlsc给出了一个答案,将这种方法描述为次要解决方案。我想是因为它被列为次要答案,所以我一开始就错过了它。我将把我的答案集中在PowerShell方法上,但至少想给它应得的荣誉。
以XML格式返回数据
SELECT CONVERT(XML, [Data]) AS [Value]
FROM [dbo].[FormData]
WHERE [UID] LIKE '{my-uid}'
确保您在SSMS选项窗口中设置了合理的限制,具体取决于您期望的结果。
如果你返回的文本不包含未编码的字符,比如&而不是&这将导致XML转换失败。
使用PowerShell返回数据
为此,您需要在将要运行命令的机器上安装PowerShell SQL Server模块。
如果你已经设置好了,配置并运行下面的脚本:
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"
确保您将-MaxCharLength参数设置为适合您需要的值。
今天我用这个方法成功了。它与其他答案相似,它也将内容转换为XML,只是使用了不同的方法。由于我没有在答案中看到FOR XML PATH,我想为了完整性,我应该添加它:
SELECT [COL_NVARCHAR_MAX]
FROM [SOME_TABLE]
FOR XML PATH(''), ROOT('ROOT')
这将交付一个包含所有行内容的有效XML,嵌套在一个外部<ROOT></ROOT>元素中。每一行的内容都包含在一个元素中,在本例中,该元素称为<COL_NVARCHAR_MAX>。它的名称可以通过AS使用别名来更改。
特殊字符如&、<或>或类似字符将被转换为它们各自的实体。所以你可能需要转换<, >和,回到它们原来的字符,这取决于你需要对结果做什么。
EDIT
我刚刚意识到CDATA也可以使用FOR XML指定。不过我觉得有点麻烦。这样可以做到:
SELECT 1 as tag, 0 as parent, [COL_NVARCHAR_MAX] as [COL_NVARCHAR_MAX!1!!CDATA]
FROM [SOME_TABLE]
FOR XML EXPLICIT, ROOT('ROOT')
快速技巧-
SELECT CAST('<A><![CDATA[' + CAST(LogInfo as nvarchar(max)) + ']]></A>' AS xml)
FROM Logs
WHERE IDLog = 904862629
替代方案1:右键单击复制单元格并粘贴到文本编辑器(希望与utf-8支持)
方法2:右键单击,导出到CSV文件
替代方案3:使用SUBSTRING函数来可视化列的各个部分。例子:
SELECT SUBSTRING(fileXml,2200,200) FROM mytable WHERE id=123456
推荐文章
- 在SQL中更新多个列
- 如何删除表中特定列的第一个字符?
- 等价的限制和偏移SQL Server?
- 如何从SQL Server中的字符串中剥离所有非字母字符?
- 为什么我不能在DELETE语句中使用别名?
- 在SQL Server Management Studio中保存带有标题的结果
- 多语句表值函数vs内联表值函数
- NOLOCK提示在SELECT语句中的作用
- SQL OVER()子句-它什么时候有用,为什么有用?
- 检查SQL Server登录是否已经存在
- 我如何使用ROW_NUMBER()?
- SQL或者TSQL是图灵完备的吗?
- 如何检查表上持有哪些锁
- SQL Server数据库备份恢复到低版本
- SQL Server:过滤sp_who2的输出