我有一个过程,该过程以前从数据库中的存储过程中获取了字符串,并替换了某些表,并通过长替换函数删除了过程中的大块数据。然后,我将使用此操纵字符串创建一个新过程
它工作了大约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
答案 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'))