脚本会提取在where子句中包含函数的所有存储过程的名称。

12 浏览
0 Comments

脚本会提取在where子句中包含函数的所有存储过程的名称。

有人能帮我找到一个提取所有存储过程中包含函数的where子句的脚本吗?

例如:ISNULL(fieldname,0)

0
0 Comments

检查存储过程中使用了函数的方法如下:

DECLARE @i INT = 1
DECLARE @count INT = (SELECT COUNT(1) FROM SYS.SYSOBJECTS WHERE XTYPE='TF' OR XTYPE='FN')
DECLARE @sql NVARCHAR(MAX) = ''
DECLARE @union NVARCHAR(30) = ' UNION ALL '
DECLARE @name NVARCHAR(100)
WHILE @i <= @count
BEGIN
    SET @name = (SELECT NAME FROM (SELECT SO.NAME,ROW_NUMBER() OVER (ORDER BY SO.NAME) RN FROM SYS.SYSCOMMENTS SC INNER JOIN SYS.SYSOBJECTS SO
                            ON SO.ID = SC.ID WHERE SO.XTYPE = 'TF' OR SO.XTYPE = 'FN')T1 WHERE RN = @i)
    SET @sql = @sql + ' SELECT ' + '''' + @name + '''' 
    IF(@i != @count)
        BEGIN
            SET @sql = @sql + @union
        END
    SET @i = @i + 1
END
DECLARE @result TABLE
(
ID INT IDENTITY(1,1),
TITLE NVARCHAR(MAX)
)
INSERT INTO @result
EXEC SP_EXECUTESQL @sql
DECLARE @j INT = 1
DECLARE @resultCount INT = (SELECT COUNT(1) FROM @result)
DECLARE @search NVARCHAR(MAX) = ' '
DECLARE @text NVARCHAR(100)
WHILE @j <= @resultCount
BEGIN
    SET @text = (SELECT NAME FROM (SELECT TITLE 'NAME',ROW_NUMBER() OVER (ORDER BY TITLE) RN FROM @result)T1 WHERE RN = @j)
    SET @search = @search + ' LIKE ' + '''' + '%' + @text + '%' + ''''
    IF @j != @resultCount
        SET @search = @search + ' OR SC.TEXT'
    IF @j = @resultCount
        SET @search = @search + ' ) '
    SET @j = @j + 1
END
DECLARE @finalQuery NVARCHAR(MAX)
SET @finalQuery = 'SELECT SO.NAME,SC.TEXT FROM
SYS.SYSCOMMENTS SC INNER JOIN SYS.SYSOBJECTS SO ON SC.ID = SO.ID WHERE (SC.TEXT ' + @search + ' AND (SO.XTYPE !=''TF'' AND SO.XTYPE !=''FN'')'
EXECUTE SP_EXECUTESQL @finalQuery

出现这个问题的原因是为了查找存储过程中使用了函数的情况。为了解决这个问题,可以使用上述的代码,其中首先使用一个循环将存储过程中使用的函数名称保存到一个表中,然后再使用另一个循环将这些函数名称作为关键字进行搜索,最后将结果返回。

0
0 Comments

问题的出现原因是需要获取在存储过程中使用了函数的存储过程的名称。然而,无法直接获取系统函数的列表。因此,需要找到一种方法来获取用户定义函数的列表。

解决方法是使用以下SQL查询语句来获取使用了函数的存储过程的名称:

SELECT ROUTINE_NAME
FROM   INFORMATION_SCHEMA.ROUTINES A
       JOIN SYS.OBJECTS B
         ON A.ROUTINE_DEFINITION LIKE '%' + B.NAME + '%'
            AND B.TYPE IN ( 'FN', 'IF', 'TF' )
            AND A.ROUTINE_TYPE = 'PROCEDURE'

这个查询语句将在INFORMATION_SCHEMA.ROUTINES表和SYS.OBJECTS表之间进行连接,并使用LIKE操作符来匹配存储过程的定义中是否包含函数名称。同时,还使用了B.TYPE IN ( 'FN', 'IF', 'TF' )条件来限制只获取用户定义函数的列表。最后,使用A.ROUTINE_TYPE = 'PROCEDURE'条件来确保只获取存储过程的列表。

通过这种方法,就可以获取到使用了函数的存储过程的名称。

0
0 Comments

问题:如何找出具有函数在where子句中的所有存储过程的名称?

原因:这个问题的出现是因为作者发现难以找到具有函数在where子句中的所有存储过程的名称。

解决方法:作者的第一次尝试是运行以下代码:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES

WHERE ROUTINE_TYPE = 'PROCEDURE'

AND ROUTINE_DEFINITION LIKE '%WHERE%ISNULL%'

但是这需要尝试所有函数,更好的方法是将此查询与包含所有内置函数的表进行连接。

0