2016-07-29 2 views
2

非常に大きいnvarchar(max)フィールドにはhtmlが含まれています。このhtml内にimgタグがあります。文字列またはバイナリデータが切り捨てられます - 大きな文字列

例:

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

置き換えるされているものが多いが、これよりも少し小さいですが、していないが、この列の長さは、1645151です。私たちがやろうとしている何

、列にSQLに置き換えている:@sourceは、NVARCHAR(MAX)に割り当てられている文字列を、上記のように画像のバイトです

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

変数の前に置き換えを実行します。 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文字の文字列で5万文字の文字列を検索しようとしていました。これは、他の順序でパラメータを持つPostgresの 'strpos'からコピーしたためです。 – Noumenon

関連する問題