[英]Replace Statement: String or binary data would be truncated - 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
这是因为某些代码的长度超过了8,000个字符。 CHARINDEX有8,000个字符的限制。
https://docs.microsoft.com/en-us/sql/t-sql/functions/charindex-transact-sql?view=sql-server-2017
对原始问题的道歉意识到问题是什么并不是很清楚。 我无法识别问题,但怀疑REPLACE函数可能有字符限制,一旦第一个REPALCE被解析,它可能会在转移到下一个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'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.