在SQL Server中搜索所有表格来找到一个字符串
在SQL Server 2012中更新TechDo的答案时,需要将:'FROM ' + + ' (NOLOCK) '
更改为FROM ' + + 'WITH (NOLOCK) ' +
,否则将出现以下错误:Deprecated feature 'Table hint without WITH' is not supported in this version of SQL Server.
以下是完整更新的存储过程:
CREATE PROC SearchAllTables ( nvarchar(100) ) AS BEGIN CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) SET NOCOUNT ON DECLARE nvarchar(256), nvarchar(128), nvarchar(110) SET = '' SET = QUOTENAME('%' + + '%','''') WHILE IS NOT NULL BEGIN SET = '' SET = ( SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > AND OBJECTPROPERTY( OBJECT_ID( QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) ), 'IsMSShipped' ) = 0 ) WHILE ( IS NOT NULL) AND ( IS NOT NULL) BEGIN SET = ( SELECT MIN(QUOTENAME(COLUMN_NAME)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = PARSENAME(, 2) AND TABLE_NAME = PARSENAME(, 1) AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal') AND QUOTENAME(COLUMN_NAME) > ) IF IS NOT NULL BEGIN INSERT INTO #Results EXEC ( 'SELECT ''' + + '.' + + ''', LEFT(' + + ', 3630) FROM ' + + 'WITH (NOLOCK) ' + ' WHERE ' + + ' LIKE ' + ) END END END SELECT ColumnName, ColumnValue FROM #Results END
如何调用这个存储过程?
.VanDenBosch 您将其保存为存储过程,然后执行存储过程。
文章标题:在SQL Server中通过搜索所有表找到字符串的方法
有时候我们需要在SQL Server中搜索所有的表来找到特定的字符串。下面介绍了一个出现这个问题的原因以及解决方法。
出现的原因是,SQL Server本身没有提供直接搜索所有表的功能,需要使用第三方工具来实现这个功能。在这里提到了两个工具,一个是ApexSQL Search,另一个是SSMS tools pack。
ApexSQL Search是一个可以集成到SSMS中的第三方工具,可以进行模式和数据搜索。之前它是免费的,但是据2021年来看,它已经不再是免费的了。
另一个工具是SSMS tools pack,它也提供了这个功能,但是对于SQL 2012版本来说是收费的,不过价格相对较为合理。
如果不想使用第三方工具,也可以使用以上提供的存储过程来实现搜索所有表的功能。不过需要注意的是,如果要搜索日期时间列或GUID列等特殊类型的列,可能需要稍作修改。
总结起来,想要在SQL Server中搜索所有表找到特定的字符串,可以选择使用第三方工具,如ApexSQL Search或SSMS tools pack。如果不想使用第三方工具,可以使用以上提供的存储过程来实现。但无论选择哪种方法,都需要注意可能需要对存储过程进行一些修改以适应特殊类型的列。
在SQL Server中搜索所有表格来查找一个字符串的问题是出现的原因是需要在生产环境中执行,并且对临时表有限制,所以需要使用表变量和即席查询来代替。解决方法是使用以下的SQL代码:
USE DATABASE_NAME DECLARE @SEARCH_TEXT nvarchar(100) = 'SEARCH_TEXT' DECLARE @Results TABLE (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) SET NOCOUNT ON DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr nvarchar(110) SET @TableName = '' SET @SearchStr = QUOTENAME('%' + @SEARCH_TEXT + '%','''') 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 ' + @SearchStr ) END END END SELECT ColumnName, ColumnValue FROM @Results
这段代码将在指定数据库中搜索所有表格,查找包含指定字符串的列和值。使用一个循环来逐个搜索每个表格和每个列。搜索结果将保存在一个表变量中,并最后将结果返回。
希望这个解决方法对你有帮助!