2016-07-29 222 views
2

我们有一个非常大的包含html的nvarchar(max)字段。在这个html内是一个img标签。字符串或二进制数据将被截断 - 大字符串

实施例:

<img style="float:right" src="data:image/png;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/7gAOQW.... 

此列的长度为1645151,但什么被替换比这少一点,但不是很多。

我们正在尝试做的,是在SQL中替换列:

declare @url varchar(50) = 'myimageurl'; 
UPDATE table SET field = 
CAST(REPLACE(CAST(field as NVARCHAR(MAX)),@source,'@url') AS NVARCHAR(MAX)) 

其中@source,是上面的图像字节字符串,它之前被分配到一个nvarchar(最大)变量运行替换。 dest是图像的url,而不是图像字符串。

虽然我仍然得到消息字符串或二进制数据将被截断。

有谁知道这是否可能在SQL中取代这样大的字符串。

+0

只是想到这个问题,我倾向于用图像url替换整个字段的值来代替二进制数据,而不是尝试进行字符串替换。我认为这会更清晰,更易于阅读。而且更可靠。 –

+0

如果“field”的长度是1645151,外部“CAST”是否需要将其转换为nvarchar(1645151)? REPLACE函数应该已经返回nvarchar(max)。 – ADyson

+0

@ADyson nvarchar的最大尺寸是8000 –

回答

0

而不是做替换,你可以通过解析出其余的img标签来重建整个字段吗?

喜欢的东西:

declare @Field nvarchar(max) = '<img style="float:right" src="data:image/png;base64,/9j/4AAQSkZJRgA....BAQEBLAEsAAD/7gAOQW" />' 
declare @Source nvarchar(max) = 'data:image/png;base64,/9j/4AAQSkZJRgA....BAQEBLAEsAAD/7gAOQW' 
declare @URL nvarchar(max) = 'www.img.img/img.png' 
declare @Chars int = 20 

select left(@Field,patindex('%' + left(@Source,@Chars) + '%', @Field) - 1) as HTMLStart 
     ,@URL as ImgURL 
     ,right(@Field,len(@Field) - patindex('%' + right(@Source,@Chars) + '%', @Field) - @Chars + 1) as HTMLEnd 

如果你想在整个数据集在一次运行这个,你只需要认准src="data:image/png;base64,元素,并从那里使用类似的方法,以上述向后工作。取决于您如何识别要替换的二进制数据以及要替换的内容。

1

我有同样的错误,但在不同的功能。

错误在于我的模式比我的表达更长,这意味着您的搜索模式将被截断。

我希望这可以帮助别人。

此外,请确保您将模式和表达式放在您的函数的正确位置。

+0

例如,如果您键入'CHARINDEX(haystack,needle)'而不是正确的方式。我试图在13个字符中搜索一个50,000字符的字符串,因为我从具有其他顺序参数的Postgres'strpos'中复制。 – Noumenon

相关问题