如何通过搜索 SQL 服务器中的所有表来查找任何数据类型的值
How Find a value as any Data Type by searching all tables in SQL Server
我正在使用 SQL 服务器
我想在我的查询中的任何地方进行搜索
例如:
我想在整个数据库中搜索这个“123”值
不仅搜索字符串还搜索数字:'123' 和 123
根据其类型为每一列
请指导我
您可以试试下面的查询。我已经尝试过并发现效果非常好。
DECLARE @SearchStr nvarchar(100)
SET @SearchStr = '201902'
-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Updated and tested by Tim Gaunt
-- http://www.thesitedoctor.co.uk
-- http://blogs.thesitedoctor.co.uk/tim/2010/02/19/Search+Every+Table+And+Field+In+A+SQL+Server+Database+Updated.aspx
-- Tested on: SQL Server 7.0, SQL Server 2000, SQL Server 2005 and SQL Server 2010
-- Date modified: 03rd March 2011 19:00 GMT
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
我在下面找到了这个 link。您还将找到一个存储过程来执行此操作。
https://thesitedoctor.co.uk/blog/search-every-table-and-field-in-a-sql-server-database-updated/
这是另一种方法。它只是循环所有必需的表列组合和 returns 匹配的结果。
-- creating a temp table to fetch all tables in scope
drop table if exists #TMP_TABLE ;
create table #TMP_TABLE (
PK INT IDENTITY,
TABLE_NAME varchar(500),
COLUMN_NAME varchar(500),
IS_EXIST bit
)
INSERT INTO #TMP_TABLE (TABLE_NAME,COLUMN_NAME)
SELECT C.TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE -- C.TABLE_NAME = <your-tables> AND
C.DATA_TYPE in( 'varchar', 'int'); -- modify it to handle data types at once.
declare @MINID int, @MAXID int, @TABLE_NAME varchar(500), @COLUMN_NAME varchar(500), @sqlString varchar(max);
-- setting boundaries for the while loop
SET @MINID = (SELECT ISNULL(MIN(PK),0) FROM #TMP_TABLE );
SET @MAXID = (SELECT ISNULL(MAX(PK),0) FROM #TMP_TABLE );
-- looping all the table-columns in scope
WHILE ((@MINID<=@MAXID) AND (@MINID<>0))
BEGIN
SELECT @TABLE_NAME = TABLE_NAME,@COLUMN_NAME = COLUMN_NAME
FROM #TMP_TABLE
WHERE PK = @MINID;
SET @sqlString = 'UPDATE #TMP_TABLE
SET IS_EXIST = 1
WHERE EXISTS (SELECT 1
FROM '+ @TABLE_NAME+'
WHERE '+ @COLUMN_NAME +' = ''<YOUR-SEARCH-STRING>'')
AND PK = '+ CAST(@MINID AS varchar(10));
EXEC(@sqlString) ;
SET @MINID = (SELECT MIN(PK) FROM #TMP_TABLE WHERE PK > @MINID );
END
SELECT * FROM #TMP_TABLE WHERE IS_EXIST = 1 ; -- will give you matched results.
我正在使用 SQL 服务器 我想在我的查询中的任何地方进行搜索
例如: 我想在整个数据库中搜索这个“123”值
不仅搜索字符串还搜索数字:'123' 和 123 根据其类型为每一列
请指导我
您可以试试下面的查询。我已经尝试过并发现效果非常好。
DECLARE @SearchStr nvarchar(100)
SET @SearchStr = '201902'
-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Updated and tested by Tim Gaunt
-- http://www.thesitedoctor.co.uk
-- http://blogs.thesitedoctor.co.uk/tim/2010/02/19/Search+Every+Table+And+Field+In+A+SQL+Server+Database+Updated.aspx
-- Tested on: SQL Server 7.0, SQL Server 2000, SQL Server 2005 and SQL Server 2010
-- Date modified: 03rd March 2011 19:00 GMT
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
我在下面找到了这个 link。您还将找到一个存储过程来执行此操作。 https://thesitedoctor.co.uk/blog/search-every-table-and-field-in-a-sql-server-database-updated/
这是另一种方法。它只是循环所有必需的表列组合和 returns 匹配的结果。
-- creating a temp table to fetch all tables in scope
drop table if exists #TMP_TABLE ;
create table #TMP_TABLE (
PK INT IDENTITY,
TABLE_NAME varchar(500),
COLUMN_NAME varchar(500),
IS_EXIST bit
)
INSERT INTO #TMP_TABLE (TABLE_NAME,COLUMN_NAME)
SELECT C.TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE -- C.TABLE_NAME = <your-tables> AND
C.DATA_TYPE in( 'varchar', 'int'); -- modify it to handle data types at once.
declare @MINID int, @MAXID int, @TABLE_NAME varchar(500), @COLUMN_NAME varchar(500), @sqlString varchar(max);
-- setting boundaries for the while loop
SET @MINID = (SELECT ISNULL(MIN(PK),0) FROM #TMP_TABLE );
SET @MAXID = (SELECT ISNULL(MAX(PK),0) FROM #TMP_TABLE );
-- looping all the table-columns in scope
WHILE ((@MINID<=@MAXID) AND (@MINID<>0))
BEGIN
SELECT @TABLE_NAME = TABLE_NAME,@COLUMN_NAME = COLUMN_NAME
FROM #TMP_TABLE
WHERE PK = @MINID;
SET @sqlString = 'UPDATE #TMP_TABLE
SET IS_EXIST = 1
WHERE EXISTS (SELECT 1
FROM '+ @TABLE_NAME+'
WHERE '+ @COLUMN_NAME +' = ''<YOUR-SEARCH-STRING>'')
AND PK = '+ CAST(@MINID AS varchar(10));
EXEC(@sqlString) ;
SET @MINID = (SELECT MIN(PK) FROM #TMP_TABLE WHERE PK > @MINID );
END
SELECT * FROM #TMP_TABLE WHERE IS_EXIST = 1 ; -- will give you matched results.