首页 > 解决方案 > MS SQL Server Management Studio 中“文本”类型的列显示不正确

问题描述

在 MSSQL DB 中,我有类型为(文本,空)的列 ResponseInfo。对于某些 (!) 行,MS SQL Management Studio 显示列的输出不正确。

对于值(预期结果):

{"result":"Status:U-OK","hasError":false,"errorDetails":null}

它仅显示 Management Studio 中的第一个括号:

{

在“将结果另存为”上,它将列值保存在文本文件中,其中每个字符用空格分隔:

{ " r e s u l t " : " S t a t u s :   U   -   O K " , " h a s E r r o r " : f a l s e , " e r r o r D e t a i l s " : n u l l }

我怀疑它可能与编码有关(表编码为“Latin1_General_100_BIN”),我尝试创建 nvarchar(MAX) 列并从 ResponseInfo 列中设置值,但它为新列输出相同的结果。如果您知道如何解决此问题,请提供帮助。

标签: sql-server

解决方案


症状看起来像问题行的值在应用程序插入数据库时​​被编码为 Unicode。T-SQL 示例:

CREATE TABLE dbo.YourTable(ResponseInfo text);

DECLARE @UnicodeValue nvarchar(MAX) = N'{"result":"Status:U-OK","hasError":false,"errorDetails":null}';
DECLARE @BinaryValue varbinary(MAX) = CAST(@UnicodeValue AS varbinary(MAX));
DECLARE @VarcharValue varchar(MAX) = CAST(@BinaryValue AS varchar(MAX));

INSERT INTO dbo.YourTable VALUES(@VarcharValue);

SELECT ResponseInfo
FROM dbo.YourTable;

您可以检查原始值以验证:

SELECT CAST(ResponseInfo AS varbinary(MAX))
FROM dbo.YourTable;

如果数据未正确编码,您可以使用如下所示的更新查询来扭转错误。确保仅针对问题行。

UPDATE dbo.YourTable
SET ResponseInfo = CAST(CAST(CAST(CAST(ResponseInfo AS varchar(MAX)) AS varbinary(MAX)) AS nvarchar(MAX)) AS varchar(MAX))
WHERE <problem-row-criteria-here>;

当然,您需要修复应用程序以避免出现问题。尽管与您的问题无关,但最好使用varchar(MAX)ornvarchar(MAX)代替已弃用的text数据类型。


推荐阅读