zoukankan      html  css  js  c++  java
  • 根据名称查找存储过程或函数

    -- =============================================
    -- Author:        FWM
    -- Create date: 20201126
    -- Description:    根据名称查找存储过程或函数
    -- =============================================
    ALTER PROCEDURE [dbo].[SearchProcOrFuncByNameProc]
      @srh    NVARCHAR(MAX),
      @srh1   NVARCHAR(MAX),
      @types  NVARCHAR(MAX), -- 格式:(,\w*)*
      @dbs    NVARCHAR(MAX),
      @orders NVARCHAR(MAX)
    AS
    BEGIN
      SET NOCOUNT ON;
    
      IF ISNULL(@srh, N'') = N''
      BEGIN
        PRINT N'请提供 @srh 参数';
        RETURN;
      END;
    
      DECLARE @tempXML XML;
      DECLARE @dbTbl TABLE (dbname NVARCHAR(MAX));
    
      IF ISNULL(@dbs, N'') = N''
      BEGIN
        INSERT @dbTbl (dbname)
        SELECT name
        FROM   sys.sysdatabases
        WHERE  name NOT IN ('master', 'tempdb', 'model', 'msdb', 'OldCustomerBak');
      END;
      ELSE
      BEGIN
        SET @tempXML = N'<v>' + REPLACE(@dbs, N' ', N'</v><v>') + N'</v>';
    
        INSERT @dbTbl (dbname)
        SELECT t.val
        FROM   (SELECT t.c.value(N'.', N'NVARCHAR(MAX)') val
                FROM   @tempXML.nodes(N'/v') t(c) ) t
        WHERE  t.val <> N'';
    
        IF NOT EXISTS (SELECT 1 FROM @dbTbl)
        BEGIN
          PRINT N'请输入需要查找的数据库';
          RETURN;
        END;
      END;
    
      DECLARE @conditionType NVARCHAR(MAX);
    
      IF ISNULL(@types, N'') = N''
        SET @conditionType = N'''P'', ''FN'', ''TF'', ''IF'', ''TR'', ''V''';
      ELSE
        SET @conditionType = STUFF(
                             (SELECT N', ''' + t.val + N''''
                              FROM   (SELECT CASE WHEN CHARINDEX(N',', @types, p.number + 1) > 0 THEN
                                                    SUBSTRING(@types, p.number + 1, CHARINDEX(N',', @types, p.number + 1) - p.number - 1)
                                                  ELSE SUBSTRING(@types, p.number + 1, LEN(@types) - p.number)
                                             END val
                                      FROM   master.dbo.spt_values p
                                      WHERE  p.type = N'P'
                                             AND p.number >= 1
                                             AND p.number < LEN(@types)
                                             AND SUBSTRING(@types, p.number, 1) = N',') t
                              WHERE  t.val <> N''
                             FOR XML PATH(N'')),
                             1,
                             2,
                             N'');
    
      DECLARE @sql NVARCHAR(MAX);
    
      SET @sql = (SELECT N'SELECT DISTINCT ''' + t.dbname
                         + N''' dbname, sch.name COLLATE DATABASE_DEFAULT schName, obj.name COLLATE DATABASE_DEFAULT objName, obj.type COLLATE DATABASE_DEFAULT objType, CASE obj.type WHEN ''AF'' THEN N''聚合函数 (CLR)'' WHEN ''C'' THEN N''CHECK 约束'' WHEN ''D'' THEN N''默认值或 DEFAULT 约束'' WHEN ''F'' THEN N''FOREIGN KEY 约束'' WHEN ''L'' THEN N''日志'' WHEN ''FN'' THEN N''标量函数'' WHEN ''FS'' THEN N''程序集 (CLR) 标量函数'' WHEN ''FT'' THEN N''程序集 (CLR) 表值函数'' WHEN ''IF'' THEN N''内联表函数'' WHEN ''IT'' THEN N''内部表'' WHEN ''P'' THEN N''存储过程'' WHEN ''PC'' THEN N''程序集 (CLR) 存储过程'' WHEN ''PK'' THEN N''PRIMARY KEY 约束(类型为 K)'' WHEN ''RF'' THEN N''复制筛选存储过程'' WHEN ''S'' THEN N''系统表'' WHEN ''SN'' THEN N''同义词'' WHEN ''SQ'' THEN N''服务队列'' WHEN ''TA'' THEN N''程序集 (CLR) DML 触发器'' WHEN ''TF'' THEN N''表函数'' WHEN ''TR'' THEN N''SQL DML 触发器'' WHEN ''TT'' THEN N''表类型'' WHEN ''U'' THEN N''用户表'' WHEN ''UQ'' THEN N''UNIQUE 约束(类型为 K)'' WHEN ''V'' THEN N''视图'' WHEN ''X'' THEN N''扩展存储过程'' ELSE N''未知('' + obj.type + N'''' END objTypeName, CONVERT(VARCHAR(50), obj.modify_date, 120) modifyDate FROM '
                         + t.dbname + N'.sys.objects obj INNER JOIN ' + t.dbname + N'.sys.schemas sch ON sch.schema_id = obj.schema_id WHERE obj.name LIKE ''%'
                         + @srh + N'%''' + CASE WHEN @srh1 <> N'' THEN N' AND obj.name LIKE ''%' + @srh1 + N'%''' ELSE N'' END + N' AND obj.type IN ('
                         + @conditionType + N') UNION ALL '
                  FROM   @dbTbl t
                 FOR XML PATH(N''), TYPE).value('.', 'NVARCHAR(MAX)');
    
      SET @sql = LEFT(@sql, LEN(@sql) - LEN(N' UNION ALL ')) + N' ORDER BY '
                 + CASE WHEN ISNULL(@orders, N'') = N'' THEN N'dbname, modifyDate DESC' ELSE @orders END;
    
      EXEC (@sql);
    END;
    Slowly I find myself
  • 相关阅读:
    python requests 模拟登陆网站,抓取数据
    python 爬取淘宝的模特照片
    vim 和grep 正则表达式相似和区别
    python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence
    python 正则表达式
    12个球,其中一个和其他的重量不一样,有一个天平,最多几次找出这个球
    25匹马中选出跑得最快的3匹,每次只有5匹马同时跑,最少要比赛几次
    1000瓶药水,1瓶有毒药,几只小白鼠能够找出毒药
    146 LRU Cache
    用两个int值实现读写锁
  • 原文地址:https://www.cnblogs.com/SDdemon/p/15568575.html
Copyright © 2011-2022 走看看