Sql server 如何在SQL Server中使用文本排除查找过程中的注释行/文本?

Sql server 如何在SQL Server中使用文本排除查找过程中的注释行/文本?,sql-server,Sql Server,我有两个程序,如下所示 Create proc FirstProcdure As begin select * from MyTableA --select * from MyTableB end 及 现在我想用text-MyTableA搜索过程。结果应该只出现“第一个过程”,因为在“第二个过程”中 注释文本MyTableA 我试过使用下面的查询 Select * from sysobjects where OBJECT_DEFINITION (id) like '%M

我有两个程序,如下所示

Create proc FirstProcdure
As
begin
    select * from MyTableA
    --select * from MyTableB    
end

现在我想用text-MyTableA搜索过程。结果应该只出现“第一个过程”,因为在“第二个过程”中 注释文本MyTableA

我试过使用下面的查询

Select * from sysobjects where OBJECT_DEFINITION (id) like '%MyTableA%'
目前,它在搜索结果中给出了这两个过程的名称


有时我们需要快速更改过程定义&这样就很难打开、查找和替换多个过程。因此,我只需要搜索过程名称,搜索的文本不是注释行的一部分。

您可以使用自定义函数来忽略注释文本搜索

CREATE FUNCTION SearchCommentText(@Value VARCHAR(MAX),@SearchText VARCHAR(MAX))  
RETURNS INT   
AS   
BEGIN  
   DECLARE @cursor INT = 0,@ret INT=0
   declare @commenttext varchar(max)=''
    WHILE PATINDEX('%--%', @Value) > 0 OR    PATINDEX('%/*%', @Value) > 0
    BEGIN
        IF CHARINDEX('--', @Value, 0)BETWEEN 1 AND CHARINDEX('/*', @Value, 0)
            OR    CHARINDEX('/*', @Value, 0) = 0
        BEGIN

            SET @commenttext=@commenttext+ SUBSTRING( @Value,CHARINDEX('--', @Value), ISNULL(NULLIF(CHARINDEX(CHAR(13) + CHAR(10), @Value, CHARINDEX('--',@Value)), 0), LEN(@Value)) - CHARINDEX('--', @Value) + 2)
            SET @Value = STUFF(@Value, CHARINDEX('--', @Value), ISNULL(NULLIF(CHARINDEX(CHAR(13) + CHAR(10), @Value, CHARINDEX('--', @Value)), 0), LEN(@Value)) - CHARINDEX('--', @Value) + 2, '') ;

        END ;
        ELSE
        BEGIN
            SET @cursor = -1 ;
            WHILE CHARINDEX('/*', @Value, @cursor + 1)BETWEEN 1 AND CHARINDEX('*/', @Value, @cursor + 1)
            SET @cursor = CHARINDEX('/*', @Value, @cursor + 1) ;

            set @commenttext=@commenttext+SUBSTRING(@Value, @cursor, CHARINDEX('*/', @Value, @cursor) - @cursor + 2);
            SET @Value = STUFF(@Value, @cursor, CHARINDEX('*/', @Value, @cursor) - @cursor + 2, '') ;
        END ;
    END ;
    IF(@commenttext LIKE '%'+@SearchText+'%' AND @Value NOT LIKE  '%'+@SearchText+'%')
    SET @ret=1;

    RETURN @ret;  
END; 
执行以下查询

SELECT DISTINCT OBJECT_NAME(sc.id)  FROM syscomments sc
WHERE TEXT like '%MyTableA%' AND dbo.SearchCommentText(sc.text,'MyTableA') <>1

您要寻找的是在其他dataobject中使用的dataobject是一个依赖项,因此,直接这样做太容易了

SELECT OBJECT_NAME(id) FROM sys.sysdepends WHERE depid = OBJECT_ID('MyTableA')
例如,如果要搜索与dataobject无关的字符串或其他内容,Dependes将不会检测是否使用动态SQL调用表。如果使用循环没有异议,我更喜欢使用sp_helptext而不是OBJECT_定义

DECLARE @SearchFor VARCHAR(100) = 'MyTableA'
DECLARE @Objects TABLE(name varchar(100))
DECLARE @Result TABLE(name varchar(100))
DECLARE @Lines TABLE(id int identity, line varchar(maX))

INSERT @Objects
SELECT name FROM sys.objects WHERE Type in ('FN', 'IF', 'V', 'P', 'TR', 'TF') 

DECLARE @ObjectName VARCHAR(100)
WHILE EXISTS (SELECT 1 FROM @Objects)
BEGIN
    SELECT TOP 1 @ObjectName = name FROM @Objects

    DELETE @Lines

    INSERT @Lines (line)
    exec sp_helptext @ObjectName

    --Wipe out multiline comments
    DECLARE @Linestart INT, @indexStart INT, @LineEnd INT, @indexEnd INT
    WHILE EXISTS(SELECT 1 FROM @Lines WHERE charindex('/*', line) > 0)
    BEGIN
        SELECT TOP 1 @Linestart = id, @indexStart = charindex('/*', line)
        FROM @Lines WHERE charindex('/*', line) > 0
        ORDER BY id

        SELECT TOP 1 @LineEnd = id, @indexEnd = charindex('*/', line)
        FROM @Lines WHERE charindex('*/', line) > 0
        ORDER BY id

        IF @Linestart = @LineEnd
            UPDATE @Lines SET line = SUBSTRING(line, 1, @indexStart-1) + SUBSTRING(line, @indexEnd+2, LEN(line))
            WHERE id = @Linestart
        ELSE
        BEGIN
            UPDATE @Lines SET line = SUBSTRING(line, 1, @indexStart-1)
            WHERE id = @Linestart
            UPDATE @Lines SET line = SUBSTRING(line, @indexEnd+2, LEN(line))
            WHERE id = @LineEnd
            DELETE @Lines WHERE id > @Linestart AND id < @LineEnd
        END
    END

    IF EXISTS (
        SELECT 1 
        FROM @Lines
        OUTER APPLY (
            SELECT charindex(@SearchFor, line) A, charindex ('--', line) B
        ) S
        WHERE A > 0 AND (B = 0 OR A < B) )
    BEGIN
        INSERT @Result VALUES (@ObjectName)
    END


    DELETE @Objects WHERE name = @ObjectName
END
SELECT * FROM @Result

您必须想出一种编码风格,允许您排除注释掉的代码。SQL中没有为您做任何事情。假设您不能不喜欢“%-select*from MyTableA%”,您可能需要给自己留下一条注释,例如-Exclude MyTableA,然后您可以不喜欢“%Exclude TableA%”@DaleBurrell它不是固定的“select*from”,因为它可能是处于where条件下的empCd,等等…比如“%+char10+”%[^-]%MyTableA”-从换行开始,检查是否存在-,查找表名。或者删除MyTableA,运行所有程序,看看哪个失败。让我检查一下,然后回复。@Alex,谢谢你的更新。我已经检查了单行和多行注释。@Mano感谢您的宝贵努力,这将节省我以后的时间。@Mano当文本同时出现在注释行和未注释行时,它需要更多的条件。@Mano在此过程中,文本MyTableA同时出现在注释行和未注释行中,因此它也应该出现在结果中。
DECLARE @SearchFor VARCHAR(100) = 'MyTableA'
DECLARE @Objects TABLE(name varchar(100))
DECLARE @Result TABLE(name varchar(100))
DECLARE @Lines TABLE(id int identity, line varchar(maX))

INSERT @Objects
SELECT name FROM sys.objects WHERE Type in ('FN', 'IF', 'V', 'P', 'TR', 'TF') 

DECLARE @ObjectName VARCHAR(100)
WHILE EXISTS (SELECT 1 FROM @Objects)
BEGIN
    SELECT TOP 1 @ObjectName = name FROM @Objects

    DELETE @Lines

    INSERT @Lines (line)
    exec sp_helptext @ObjectName

    --Wipe out multiline comments
    DECLARE @Linestart INT, @indexStart INT, @LineEnd INT, @indexEnd INT
    WHILE EXISTS(SELECT 1 FROM @Lines WHERE charindex('/*', line) > 0)
    BEGIN
        SELECT TOP 1 @Linestart = id, @indexStart = charindex('/*', line)
        FROM @Lines WHERE charindex('/*', line) > 0
        ORDER BY id

        SELECT TOP 1 @LineEnd = id, @indexEnd = charindex('*/', line)
        FROM @Lines WHERE charindex('*/', line) > 0
        ORDER BY id

        IF @Linestart = @LineEnd
            UPDATE @Lines SET line = SUBSTRING(line, 1, @indexStart-1) + SUBSTRING(line, @indexEnd+2, LEN(line))
            WHERE id = @Linestart
        ELSE
        BEGIN
            UPDATE @Lines SET line = SUBSTRING(line, 1, @indexStart-1)
            WHERE id = @Linestart
            UPDATE @Lines SET line = SUBSTRING(line, @indexEnd+2, LEN(line))
            WHERE id = @LineEnd
            DELETE @Lines WHERE id > @Linestart AND id < @LineEnd
        END
    END

    IF EXISTS (
        SELECT 1 
        FROM @Lines
        OUTER APPLY (
            SELECT charindex(@SearchFor, line) A, charindex ('--', line) B
        ) S
        WHERE A > 0 AND (B = 0 OR A < B) )
    BEGIN
        INSERT @Result VALUES (@ObjectName)
    END


    DELETE @Objects WHERE name = @ObjectName
END
SELECT * FROM @Result