Как передать большой символ поиска в функцию SQL Replace - PullRequest
0 голосов
/ 20 октября 2018

Этот вопрос является производным от другого поста Как передать большое string_replacement в функции SQL Replace , но в этом случае большой символ находится в поисковой части.

Например,

select REPLACE(CAST('CharactersOver10000' AS VARCHAR(MAX), 'CharactersOver8000', 'text' )

Вышеуказанное выражение select выдаст ошибку

String or binary data would be truncated.

Я узнал, что из Заменить документацию и подозревал, чтожирная часть может быть проблемой, но не совсем уверен, что это значит и как обращаться со строкой_паттерна, длина которой превышает 8000 символов.

string_pattern Подстрока, которую нужно найти.string_pattern может иметь символьный или двоичный тип данных.string_pattern не может быть пустой строкой (''), и не должен превышать максимальное количество байтов, которое помещается на странице.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Я думаю, что мы обсуждали это ранее , теперь согласно Документам в Интернете

varchar[(n | max)] Строковые данные переменной длины.n определяет длину строки и может принимать значение от 1 до 8000.max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт (2 ГБ).

REPLACE ( string_expression , string_pattern , string_replacement ) 

Итак, если у вас есть строковые данные, хранящиеся >8000, вы должны объявить / привести их какVARCHAR(MAX)/NVARCHAR(MAX) это относится к string_expression, на который я отвечаю в другом вопросе, теперь обращаюсь к вашему коду

SELECT REPLACE(
                CAST('CharactersOver10000' AS VARCHAR(MAX),
                'CharactersOver8000', --Here is your problem
                'text' 
              );

string_pattern должно быть <<code>string_expression и должно быть <= 8000 ( не должно превышать максимальное количество байтов, которое умещается на странице. , как указано), если это > 8000, функция REPLACE() не будет работать, и вы получите

String илидвоичные данные будут усечены.


Решение:

Вы можете разбить ваш string_pattern на 2 или более частей.

Вот Демо , имитирующее ваш случай.

0 голосов
/ 20 октября 2018

Полагаю, вторая строка также нуждается в приведении

select REPLACE(
               CAST('CharactersOver10000' AS VARCHAR(MAX)),
               CAST('CharactersOver8000' AS VARCHAR(MAX)), 
              'text' )

В любом случае, я провел тест с использованием переменных и не получил никакой ошибки:

SQL DEMO

DECLARE @source VARCHAR(MAX) = '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';                                ;
DECLARE @target VARCHAR(MAX);
SET @target = @source + @source + @source + @source + @source + @source + @source + @source + @source + @source;
SET @target = @target + @target + @target + @target + @target + @target + @target + @target;

SET @source = @source + @source + @source + @source + @source + @source + @source + @source + @source + @source;
SET @source = @source + @source + @source + @source + @source + @source + @source + @source + @source + @source;


SELECT len(@source) as source_size,
       len(@target) as target_size       
       ;

enter image description here

select REPLACE(CAST(@source as VARCHAR(MAX)), @target, 'text' );      

select REPLACE(@source, @target, 'text' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...