Оператор замены: Строковые или двоичные данные будут обрезаны - NVARCHAR (макс.) - PullRequest
0 голосов
/ 12 апреля 2019

У меня была процедура, которая ранее брала строку из хранимой процедуры в моей базе данных, заменяла некоторые таблицы и удаляла большие фрагменты процедуры с помощью функции long replace. Затем я бы создал новую процедуру, используя эту строку

Это работало около 2 месяцев, но недавно я получаю сообщение об ошибке

Сообщение 8152, Уровень 16, Состояние 10, Строка 2
Строковые или двоичные данные будут усечены

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

Любая помощь будет высоко ценится.

DECLARE @PriorityProcedureString AS VARCHAR(MAX)

SET @PriorityProcedureString = 
(SELECT 
     /*1*/REPLACE(
     /*1*/OBJECT_DEFINITION(object_id(ROUTINE_NAME)),
    (SUBSTRING (OBJECT_DEFINITION(object_id(ROUTINE_NAME)), -- String 
                CHARINDEX('µ',OBJECT_DEFINITION(object_id(ROUTINE_NAME))), -- Start_Position
                (CHARINDEX('!',OBJECT_DEFINITION(object_id(ROUTINE_NAME))) - CHARINDEX('µ',OBJECT_DEFINITION(object_id(ROUTINE_NAME))))-- Length
                )
    )   
                                                                                    ,''
                                                                                    )
            FROM INFORMATION_SCHEMA.ROUTINES
            WHERE specific_name LIKE 'usp_Cs_Coll_NBA_Priority_And_Exclusions'
)

SELECT @PriorityProcedureString

-- EXEC @PriorityProcedureString

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Извиняюсь за исходный вопрос, понимаю, что не совсем понятно, в чем проблема.Я не смог определить проблему, но подозреваю, что функция REPLACE потенциально имеет ограничение по количеству символов, и как только первый REPALCE был разрешен, он потенциально обрезал мою строку перед переходом к следующему REPLACE?

Вместо I 'мы поместили его в переменную и выполнили оператор замены поэтапно, это не дает мне никаких ошибок.

Основная цель этого кода состояла в том, чтобы просто взять существующую живую процедуру, которая заполняет важные для бизнеса таблицы и заменить всетаблицы в нем с фиктивными или имитационными таблицами, так что я могу возиться с различными результатами логического вывода и не влиять на какие-либо процессы.Я хотел сделать это таким образом, потому что процедура ежедневно изменялась различными пользователями SQL, поэтому ручное выполнение сценариев оставляло бы процедуру 'Simulation' устаревшей.

Если у кого-то есть более эффективный способделайте это, если вы могли бы поделиться, поскольку приведенное ниже решение является громоздким и требует ручного обновления при добавлении новых таблиц.

/******************************************************************************************
    * Put Procedure Text Into String *
    *******************************************************************************************/

SET @Priority_ExecutableString = (
                       SELECT OBJECT_DEFINITION(object_id(ROUTINE_NAME))
                       FROM INFORMATION_SCHEMA.ROUTINES
                       WHERE specific_name LIKE 'usp_Cs_Coll_NBA_Priority_And_Exclusions'
                       )

/******************************************************************************************
*   Use Substring To Remove Parts Of String *
* As defined by the µ start and ! End Points In The Original Procedure
*******************************************************************************************/

SET @StringIWantToRemove = 
(
SELECT SUBSTRING (@Priority_ExecutableString, -- String 
CHARINDEX('µ',@Priority_ExecutableString), -- Start_Position
(CHARINDEX('!',@Priority_ExecutableString) - CHARINDEX('µ',@Priority_ExecutableString)))-- Length
)



   SET @Priority_ExecutableString = (SELECT REPLACE(@Priority_ExecutableString, @StringIwantToRemove,''))

/**************************************************************************************

    ****
    *   Step 2 : Replace Defaulted 'Create Procedure' With 'Alter Procedure'
    *******************************************************************************************/

SET @Priority_ExecutableString = (SELECT REPLACE(@Priority_ExecutableString, 'Create Procedure', 'ALTER PROCEDURE'))

/******************************************************************************************
*   Step 3 : Replace Original Procedure Name With Simulation Procedure Name
*******************************************************************************************/

SET @Priority_ExecutableString = (SELECT REPLACE(@Priority_ExecutableString, '[dbo].[usp_Cs_Coll_NBA_Priority_And_Exclusions]','[dbo].[usp_Cs_Coll_NBA_Priority_And_Exclusions_Simulation]'))

/******************************************************************************************
*   Step 4 : Replace Offer_Stage Table With Offer_Stage Simulation Table
*******************************************************************************************/

SET @Priority_ExecutableString = (SELECT REPLACE(@Priority_ExecutableString, 'WORKDBOPS_NBA.dbo.t_CS_Coll_NBA_offer_stage','WORKDBOPS_NBA.dbo.t_CS_Coll_NBA_offer_stage_Simulation'))
0 голосов
/ 12 апреля 2019

Это связано с тем, что длина вашего кода превышает 8 000 символов. CHARINDEX имеет ограничение в 8000 символов.

https://docs.microsoft.com/en-us/sql/t-sql/functions/charindex-transact-sql?view=sql-server-2017

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...