更新 SQL Server 中的 nvarchar(max) 具有巨大价值

问题描述 投票:0回答:1

我正在尝试使用解析为文本的巨大 JSON 手动更新类型为

nvarchar(max)
的 SQL Server 列。

这是一个简单直接的查询:

UPDATE Books 
SET Story = '' 
WHERE Id = 23

当我尝试插入

Story
的 JSON 包含一个巨大的值(JSON 的一部分)时,就会出现问题(我认为断点约为 38k 个字符)

"Text": "testtesttesttest..." (imagine the value is 50k characters)

通常 SQL Server Management Studio 中单引号中的文本值是红色的,这并不是因为值太大。如果我将文本分成多个新行,那么它会被接受为“有效”字符串,但 JSON 验证失败 -

JSON 文本格式不正确。意外的字符' ' 在位置 33043 处找到。

我也尝试使用 + CHAR(13) +' 分割大行,但没有成功。

有没有办法在维护整个 JSON 的同时更新值?

json sql-server sql-update nvarchar
1个回答
0
投票

超过 32,768 个字符 (

POWER(2,15)
) 的行会破坏该行和所有后续行的智能感知。

您可以忽略它,因为它仍然可以正常执行。

或者,您可以拆开行并连接字符串。这不会在字符串中嵌入换行符。

确保您连接的所有元素都有

N
前缀,并且第一个元素键入为
MAX

UPDATE Books 
    SET Story = CAST(N'YourLongString' AS NVARCHAR(MAX)) + 
                N'YourLongStringContinued'
WHERE Id = 23

或者您可以使用 反斜杠字符 将字符串继续到新行,而不插入换行符,但您需要抵制在此处缩进字符串的冲动,以避免在字符串内容本身中插入不需要的空格。

    UPDATE Books 
        SET Story = 
N'YourLongString\
YourLongStringContinued'
    WHERE Id = 23

如果您很高兴接受智能感知将在长行中被破坏,但只是想避免它在后续行中被破坏,您甚至可以为此声明一个变量并在文件的最后一行中分配长字符串。并使用

GOTO
来分配变量并跳回文件中的原始位置。

© www.soinside.com 2019 - 2024. All rights reserved.