如何在sql server数据库中搜索字符串?

bob*_*tko 104 sql-server search stored-procedures function

我知道这是可能的,但不知道如何.

我需要在Microsoft SQL数据库中搜索特定字符串的所有提及.例如:我想搜索所有表,视图,函数,存储过程,...字符串"tblEmployes".(不是表格中的数据)

我需要这个的原因之一,我想删除一些创建的额外数据表,但我担心它们可能在程序或函数中的某个地方使用.

任何帮助表示赞赏.

l--*_*''' 137

这将搜索特定数据库中每个表的每一列.在要搜索的数据库上创建存储过程.

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1#2:

CREATE PROCEDURE FindMyData_String
    @DataToFind NVARCHAR(4000),
    @ExactMatch BIT = 0
AS
SET NOCOUNT ON

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT)

    INSERT  INTO @Temp(TableName,SchemaName, ColumnName, DataType)
    SELECT  C.Table_Name,C.TABLE_SCHEMA, C.Column_Name, C.Data_Type
    FROM    Information_Schema.Columns AS C
            INNER Join Information_Schema.Tables AS T
                ON C.Table_Name = T.Table_Name
        AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
    WHERE   Table_Type = 'Base Table'
            And Data_Type In ('ntext','text','nvarchar','nchar','varchar','char')


DECLARE @i INT
DECLARE @MAX INT
DECLARE @TableName sysname
DECLARE @ColumnName sysname
DECLARE @SchemaName sysname
DECLARE @SQL NVARCHAR(4000)
DECLARE @PARAMETERS NVARCHAR(4000)
DECLARE @DataExists BIT
DECLARE @SQLTemplate NVARCHAR(4000)

SELECT  @SQLTemplate = CASE WHEN @ExactMatch = 1
                            THEN 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       = ''' + @DataToFind + '''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            ELSE 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       Like ''%' + @DataToFind + '%''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            END,
        @PARAMETERS = '@DataExists Bit OUTPUT',
        @i = 1

SELECT @i = 1, @MAX = MAX(RowId)
FROM   @Temp

WHILE @i <= @MAX
    BEGIN
        SELECT  @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName)
        FROM    @Temp
        WHERE   RowId = @i


        PRINT @SQL
        EXEC SP_EXECUTESQL @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT

        IF @DataExists =1
            UPDATE @Temp SET DataFound = 1 WHERE RowId = @i

        SET @i = @i + 1
    END

SELECT  SchemaName,TableName, ColumnName
FROM    @Temp
WHERE   DataFound = 1
GO
Run Code Online (Sandbox Code Playgroud)

运行它只是这样做:

exec FindMyData_string 'google', 0
Run Code Online (Sandbox Code Playgroud)

工作得非常好!!!

  • 这只返回它找到的第一个结果,没有别的.有没有办法让它返回数据库中所有字符串的实例? (4认同)
  • 第二个参数“exactMatch = 0”是什么意思? (2认同)
  • 我必须在哪里保存此脚本以及需要执行该文件的扩展名是什么?我在哪里执行 `exec FindMyData_string 'google', 0` ? (2认同)

mar*_*c_s 58

如果您需要按名称查找数据库对象(例如表,列,触发器) - 请查看名为SQL Search免费 Red-Gate工具,它会执行此操作 - 它会在整个数据库中搜索任何类型的字符串.

在此输入图像描述

在此输入图像描述

对于任何DBA或数据库开发人员来说,它都是必备工具 - 我是否已经提到它可以完全免费用于任何类型的使用?

  • 好的工具,但它不会在表格中搜索字符串 (24认同)
  • @LearningJrDev:**no** - 它按名称搜索**数据库对象** - 表,视图,存储过程等.它不会**搜索表中包含的数据 - 我从来没有声称它做过! (8认同)
  • @JGilmartin让我引用问题的一部分_我想搜索所有表,视图,函数,存储过程,...字符串"tblEmployes".**(不是表中的数据)**_如果要在表中搜索数据,则使用T-SQL语言.该工具非常适合重构任务. (4认同)
  • 不搜索实际行 (2认同)

Geo*_*ber 45

您还可以尝试ApexSQL搜索 - 它是一个类似于SQL搜索的免费SSMS添加.

如果你真的只想使用sql,你可能想尝试这个脚本

select 
S.name as [Schema], 
o.name as [Object], 
o.type_desc as [Object_Type], 
C.text as [Object_Definition]
from sys.all_objects O inner join sys.schemas S on O.schema_id = S.schema_id
inner join sys.syscomments C on O.object_id = C.id
where S.schema_id not in (3,4) -- avoid searching in sys and INFORMATION_SCHEMA schemas
and C.text like '%ICE_%'
order by [Schema]
Run Code Online (Sandbox Code Playgroud)

  • ApexSQL搜索非常棒.不需要使用此工具的脚本. (4认同)
  • 此查询仅搜索对象.我们需要在所有现有表中搜索字符串. (3认同)
  • 它不再免费了:( (3认同)

The*_*yan 17

在sql server中按名称获取表:

SELECT *
FROM sys.Tables
WHERE name LIKE '%Employees%'
Run Code Online (Sandbox Code Playgroud)

按名称查找存储过程:

SELECT name
FROM sys.objects
WHERE name = 'spName'
Run Code Online (Sandbox Code Playgroud)

获取与表相关的所有存储过程:

----Option 1
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'
----Option 2
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
Run Code Online (Sandbox Code Playgroud)

  • 此查询仅搜索对象。我们需要在所有现有表中搜索一个字符串。 (4认同)

Iva*_*vić 17

您可以将数据库(如果小)导出到硬盘/桌面,然后通过文本编辑器进行字符串搜索.

  • 这实际上并不是一个坏主意. (6认同)
  • 哪个文本编辑器会很乐意加载许多 GB 的数据? (2认同)
  • MS SQL 导出是二进制文件,因此无法使用您建议的方法导出、读取或搜索。 (2认同)

ayk*_*ğan 5

这个代码搜索程序和功能但不在表中搜索:)

SELECT name FROM   sys.all_objects WHERE  Object_definition(object_id) LIKE '%text%' ORDER BY name
Run Code Online (Sandbox Code Playgroud)


小智 5

所有存储过程、视图和函数的内容都存储在表sysComments的字段文本中。所有对象的名称都存储在表sysObjects中,列位于sysColumns中。

有了这些信息,您可以使用此代码在视图、存储过程和函数的内容中搜索指定的单词:

Select b.name from syscomments a
inner join sysobjects b on a.id = b.id
where text like '%tblEmployes%'
Run Code Online (Sandbox Code Playgroud)

此查询将为您提供包含单词“tblEmployes”的对象。

要按对象名称搜索,您可以使用以下代码:

Select name from sysobjects
where name like  '%tblEmployes%'
Run Code Online (Sandbox Code Playgroud)

最后,要查找至少有一列包含单词“tblEmployes”的对象,您可以使用以下代码:

Select b.name from syscolumns a inner join sysobjects b on a.id = b.id
where a.name like  '%tblEmployes%'
Run Code Online (Sandbox Code Playgroud)

您可以使用 union 将这三个查询组合起来:

Select distinct b.name from syscomments a
inner join sysobjects b on a.id = b.id
where text like '%tblEmployes%'
union
Select distinct name from sysobjects
where name like  '%tblEmployes%'
union
Select distinct b.name from syscolumns a inner join sysobjects b on a.id = b.id
where a.name like  '%tblEmployes%'
Run Code Online (Sandbox Code Playgroud)

通过此查询,您可以获得内容或名称中或作为列包含单词“tblEmployes”的所有对象。