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