替换语句:字符串或二进制数据将被截断-NVARCHAR(max)

时间:2019-04-12 15:17:24

标签: sql sql-server

我有一个过程,该过程以前从数据库中的存储过程中获取了字符串,并替换了某些表,并通过长替换函数删除了过程中的大块数据。然后,我将使用此操纵字符串创建一个新过程

它工作了大约2个月,但最近我收到了错误消息

  

第8级第2行第16级消息8152,
  字符串或二进制数据将被截断

我尝试过更改数据类型,还删除了每个替换语句,但是它在第一个替换语句中出错,这使我认为这与数据类型或最初的操作有关。

任何帮助将不胜感激。

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 :(得分:0)

这是因为某些代码的长度超过8,000个字符。 CHARINDEX的字符数上限为8,000。

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

答案 1 :(得分:0)

对最初问题的道歉认识到问题到底是什么还不是很清楚。 我无法确定问题所在,但怀疑REPLACE函数可能有字符限制,并且第一个REPALCE解决后,它可能会截断我的字符串,然后再移至下一个REPLACE?

相反,我将其放入变量中并逐步执行了replace语句,这不会给我任何错误。

此代码的基本目标是仅采用一个现有的实时过程来填充业务关键表,并用虚拟表或模拟表替换其中的所有表,以便使我能够处理不同的逻辑输出结果而不会影响任何生命流程。我之所以要这样做,是因为该过程每天都会被不同的SQL用户更改,因此手动编写脚本将使“模拟”过程过时。

如果有人可以更有效地做到这一点,请与您分享,因为以下解决方案比较麻烦,并且每当添加新表时都需要手动更新。

/******************************************************************************************
    * 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'))