如何在SQL Server中搜索所有实例的正则表达式值?

时间:2011-09-20 09:09:09

标签: sql-server

我在一个安全的环境中工作,需要一种针对我们的SQL实例运行脚本的方法,即所有dbs,表格等,以搜索某些值的使用并显示它们的位置...有什么方法可以这样做?我已经在网上搜索,但似乎无法找到它!

我已经在各种来源(vyaskn)的帮助下整理了这个脚本,但需要帮助扩展代码以包含db和regex功能。我只是没有足够的经验来使用系统视图和动态SQL来自己做。如果搜索所有dbs更加困难,那么让正则表达式工作变得更加重要。

sp_configure 'clr enabled',1
reconfigure

DECLARE @SearchStr NVARCHAR(100)

-- search for uk phone number for example   
SET @SearchStr = '(((\+44)? ?(\(0\))? ?)|(0))( ?[0-9]{3,4}){3}'

CREATE TABLE #Results
    (
      ColumnName NVARCHAR(370) ,
      ColumnValue NVARCHAR(3630)
    )

SET NOCOUNT ON

DECLARE @TableName NVARCHAR(256) ,
    @ColumnName NVARCHAR(128) ,
    @SearchStr2 NVARCHAR(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%', '''')

WHILE @TableName IS NOT NULL 
    BEGIN
        SET @ColumnName = ''
        SET @TableName = ( SELECT   MIN(QUOTENAME(TABLE_SCHEMA) + '.'
                                        + QUOTENAME(TABLE_NAME))
                           FROM     INFORMATION_SCHEMA.TABLES
                           WHERE    TABLE_TYPE = 'BASE TABLE'
                                    AND QUOTENAME(TABLE_SCHEMA) + '.'
                                    + QUOTENAME(TABLE_NAME) > @TableName
                                    AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA)
                                                              + '.'
                                                              + QUOTENAME(TABLE_NAME)),
                                                       'IsMSShipped') = 0
                         )


        WHILE ( @TableName IS NOT NULL )
            AND ( @ColumnName IS NOT NULL ) 
            BEGIN

                SET @ColumnName = ( SELECT  MIN(QUOTENAME(COLUMN_NAME))
                                    FROM    INFORMATION_SCHEMA.COLUMNS
                                    WHERE   TABLE_SCHEMA = PARSENAME(@TableName,
                                                              2)
                                            AND TABLE_NAME = PARSENAME(@TableName,
                                                              1)
                                            AND DATA_TYPE IN ( 'char',
                                                              'varchar',
                                                              'nchar',
                                                              'nvarchar',
                                                              'int', 'decimal' )
                                            AND QUOTENAME(COLUMN_NAME) > @ColumnName
                                  )



                IF @ColumnName IS NOT NULL 
                    BEGIN

                        INSERT  INTO #Results
                                EXEC
                                    ( 'SELECT ''' + @TableName + '.'
                                      + @ColumnName + ''', LEFT('
                                      + @ColumnName + ', 3630) FROM '
                                      + @TableName + ' (NOLOCK) ' + ' WHERE '
                                      + @ColumnName + ' LIKE ' + @SearchStr2
                                    )

                    END

            END   

    END



SELECT  ColumnName ,
        ColumnValue
FROM    #Results



DROP TABLE #Results

--sp_configure 'clr enabled',0
--reconfigure

2 个答案:

答案 0 :(得分:0)

首先,您需要在特定网络中查找所有可用的SQL实例。您可以查看此example for sample code。收到有关所有SQL实例的信息后,例如服务器名称,实例名称,版本和数据库。现在,您必须具有id和密码才能与每个数据库连接,以从任何表中检索任何数据库中的任何信息。接下来创建与每个数据库的连接并执行所需的搜索操作。

您可以在搜索特定正则表达式时获取Full-Text Indexing的帮助。

答案 1 :(得分:0)

我使用EMS中的一个工具成功地在Oracle数据库架构上进行了正则表达式替换。到现在为止,我忘记了我使用的工具,但是我能够将模式导出到SQL文件并将其作为纯文本进行操作。

您可能想要试用SQL ManagerDB Extract产品。他们都有免费试用,都支持广泛的数据库。

将架构,数据和存储过程放入单个SQL文件后,运行搜索应该没问题。