我需要检查几个从远程服务器提取数据的存储过程使用的库。
我已经构建了以下代码:
DECLARE @tProcs TABLE ( procID int IDENTITY, procObjectID nvarchar(100), procName nvarchar(100) ); insert into @tProcs SELECT object_id, name FROM sys.objects WHERE type in (N'P', N'PC') and name like '%_Extract' declare @countProcs int, @I int=0 select @countProcs=COUNT(*) from @tProcs while @I<@countProcs Begin declare @source_code nvarchar(max) declare @objectID nvarchar(50) declare @proc_Name nvarchar(200) select @objectID=procObjectID from @tProcs where procID=@I select @proc_Name=procName from @tProcs where procID=@I select @source_code = definition from sys.sql_modules where object_id = @objectID SELECT PATINDEX('BOCTEST.%', @proc_Name) as Pos, @proc_Name -- or SELECT charindex(@source_code, '%BOCTEST%') set @I=@I+1 End
在每个目标存储的proc内都有这样的一行:
DECLARE YP040P_cursor CURSOR FOR SELECT * FROM BOCTEST.S653C36C.LIVEBOC_A.YP040P
我需要为每个存储的proc知道部分“ LIVEBOC_A”(可以是“ LIVEBOC_A”或LIVEBOC_B)
我试图使用PATINDEX和CHARINDEX来获取该字符串在定义中的起始opf的位置,sysmodules但是我得到的只是零,或者是字符串或二进制数据将被截断的错误。
sysmodules
尝试
SELECT name, table_name = CASE WHEN OBJECT_DEFINITION(OBJECT_ID) LIKE '%BOCTEST.S653C36C.LIVEBOC_A.YP040P%' THEN 'LIVEBOC_A' WHEN OBJECT_DEFINITION(OBJECT_ID) LIKE '%BOCTEST.S653C36C.LIVEBOC_B.YP040P%' THEN 'LIVEBOC_B' END FROM sys.objects o WHERE o.[type] IN ('P', 'PC') AND name like '%_Extract'