首页 > 解决方案 > 替换语句:字符串或二进制数据将被截断 - NVARCHAR(max)

问题描述

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

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

Msg 8152, Level 16, State 10, Line 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

标签: sqlsql-server

解决方案


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

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


推荐阅读