小编典典

从存储的proc定义中提取字符串

sql

我需要检查几个从远程服务器提取数据的存储过程使用的库。

我已经构建了以下代码:

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但是我得到的只是零,或者是字符串或二进制数据将被截断的错误。


阅读 187

收藏
2021-05-16

共1个答案

小编典典

尝试

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'
2021-05-16