SQL Server 在指定数据库的所有表的所有列中搜索给定的值
2022-11-12 09:49:02
内容摘要
这篇文章主要为大家详细介绍了SQL Server 在指定数据库的所有表的所有列中搜索给定的值,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!比
文章正文
这篇文章主要为大家详细介绍了SQL Server 在指定数据库的所有表的所有列中搜索给定的值,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
比如:我们导入了某个客户的资料,我们知道此客户的姓名是ZhangShan,我们想知道,在我们的业务数据库(eg:NorthWind)中,有哪些数据表的哪些字段设置了此姓名值ZhangShan,通过下面的SQL,我们就可以实现此目的,此处的SQL搜索自网上,在此处做了局部修改。一、搜索数据是String类型适用于搜索Text,NText,Varchar,Nvarchar,Char,NChar等类型1、创建存储过程:My_Search_StringInGivenTable代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <code> USE [NORTHWIND] GO /****** Object: StoredProcedure [dbo].[My_Search_StringInGivenTable] Script Date: 09/25/2011 15:37:14 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[My_Search_StringInGivenTable] (@SearchString NVARCHAR(MAX), @Table_Schema sysname, @Table_Name sysname) AS BEGIN DECLARE @Columns NVARCHAR(MAX), @Cols NVARCHAR(MAX), @PkColumn NVARCHAR(MAX) -- Get all character columns SET @Columns = STUFF((SELECT ', ' + QUOTENAME(Column_Name) FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE IN ( 'text' , 'ntext' , 'varchar' , 'nvarchar' , 'char' , 'nchar' ) AND TABLE_NAME = @Table_Name ORDER BY COLUMN_NAME FOR XML PATH( '' )),1,2, '' ) IF @Columns IS NULL -- no character columns RETURN -1 -- Get columns for select statement - we need to convert all columns to nvarchar(max) SET @Cols = STUFF((SELECT ', cast(' + QUOTENAME(Column_Name) + ' as nvarchar(max)) as ' + QUOTENAME(Column_Name) FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE IN ( 'text' , 'ntext' , 'varchar' , 'nvarchar' , 'char' , 'nchar' ) AND TABLE_NAME = @Table_Name ORDER BY COLUMN_NAME FOR XML PATH( '' )),1,2, '' ) SET @PkColumn = STUFF((SELECT N ' + ' '|' ' + ' + ' cast(' + QUOTENAME(CU.COLUMN_NAME) + ' as nvarchar(max))' FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CU ON TC.TABLE_NAME = CU.TABLE_NAME AND TC.TABLE_SCHEMA = CU.TABLE_SCHEMA AND Tc.CONSTRAINT_NAME = CU.CONSTRAINT_NAME WHERE TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND TC.TABLE_SCHEMA = @Table_Schema AND TC.TABLE_NAME = @Table_Name ORDER BY CU.COLUMN_NAME FOR XML PATH( '' )),1,9, '' ) IF @PkColumn IS NULL SELECT @PkColumn = 'cast(NULL as nvarchar(max))' -- set select statement using dynamic UNPIVOT DECLARE @SQL NVARCHAR(MAX) SET @SQL = 'select *, ' + QUOTENAME(@Table_Schema, '' '' ) + 'as [Table Schema], ' + QUOTENAME(@Table_Name, '' '' ) + ' as [Table Name]' + ' from (select '+ @PkColumn + ' as [PK Column], ' + @Cols + ' from ' + QUOTENAME(@Table_Name) + ' )src UNPIVOT ([Column Value] for [Column Name] IN (' + @Columns + ')) unpvt WHERE [Column Value] LIKE '' % '' + @SearchString + '' % '' ' -- print @SQL EXECUTE sp_ExecuteSQL @SQL, N '@SearchString nvarchar(max)' , @SearchString END </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <code> USE [NORTHWIND] GO /****** Object: StoredProcedure [dbo].[My_Search_String_AllTables] Script Date: 09/25/2011 15:41:58 ******/ SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO CREATE PROC [dbo].[My_Search_String_AllTables] ( @SearchString NVARCHAR(MAX) ) AS BEGIN CREATE TABLE #RESULT ([PK COLUMN] NVARCHAR(MAX), [COLUMN VALUE] NVARCHAR(MAX), [COLUMN Name] sysname, [TABLE SCHEMA] sysname, [TABLE Name] sysname) DECLARE @Table_Name sysname, @Table_Schema sysname DECLARE curAllTables CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR SELECT Table_Schema, Table_Name FROM INFORMATION_SCHEMA.Tables WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY Table_Schema, Table_Name OPEN curAllTables FETCH curAllTables INTO @Table_Schema, @Table_Name WHILE (@@FETCH_STATUS = 0) -- Loop through all tables in the database BEGIN INSERT #RESULT EXECUTE My_Search_StringInGivenTable @SearchString, @Table_Schema, @Table_Name FETCH curAllTables INTO @Table_Schema, @Table_Name END -- while CLOSE curAllTables DEALLOCATE curAllTables -- Return results SELECT * FROM #RESULT ORDER BY [Table Name] END </code> |
代码如下:
1 2 3 4 5 6 7 8 9 | <code> USE [NORTHWIND] GO DECLARE @return_value int EXEC @return_value = [dbo].[My_Search_String_AllTables] @SearchString = N 'WantValue' SELECT 'Return Value' = @return_value GO </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | <code> USE [NORTHWIND] GO /****** Object: StoredProcedure [dbo].[ZL_SearchAllTables] Script Date: 09/25/2011 15:44:10 ******/ SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO CREATE PROC [dbo].[ZL_SearchAllTables] ( @SearchStr nvarchar(100) ) AS BEGIN 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' ) 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 END [code] 二、搜索数据是Int类型 适用于搜索smallint, tinyint, int, bigint等类型 1、创建存储过程 My_Search_IntInGivenTable [code] USE [NORTHWIND] GO /****** Object: StoredProcedure [dbo].[My_Search_IntInGivenTable] Script Date: 09/25/2011 15:45:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[My_Search_IntInGivenTable] (@SearchValue INT, @Table_Schema sysname, @Table_Name sysname) AS BEGIN DECLARE @Columns NVARCHAR(MAX) , @Cols NVARCHAR(MAX) , @PkColumn NVARCHAR(MAX) , @SQL NVARCHAR(MAX) --判断并创建#Result表 IF OBJECT_ID( 'TempDB..#Result' , 'U' ) IS NOT NULL DROP TABLE #Result CREATE TABLE #RESULT ( [PK COLUMN] NVARCHAR(MAX) , [COLUMN VALUE] BIGINT , [COLUMN Name] SYSNAME , [TABLE SCHEMA] SYSNAME , [TABLE Name] SYSNAME ) --开始搜索给定的表 DECLARE curAllTables CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR SELECT Table_Schema , Table_Name FROM INFORMATION_SCHEMA.Tables WHERE Table_Name =@Table_Name OPEN curAllTables WHILE 1 = 1 BEGIN FETCH curAllTables INTO @Table_Schema, @Table_Name IF @@FETCH_STATUS <> 0 -- Loop through all tables in the database BREAK PRINT CHAR(13) + 'Processing ' + QUOTENAME(@Table_Schema) + '.' + QUOTENAME(@Table_Name) -- Get all int columns SET @Columns = STUFF(( SELECT ', ' + QUOTENAME(Column_Name) FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE LIKE '%int' AND TABLE_NAME = @Table_Name AND table_schema = @Table_Schema ORDER BY COLUMN_NAME FOR XML PATH( '' ) ), 1, 2, '' ) IF @Columns IS NULL BEGIN PRINT 'No int columns in the ' + QUOTENAME(@Table_Schema) + '.' + QUOTENAME(@Table_Name) CONTINUE END -- Get columns for select statement - we need to convert all columns to bigint SET @Cols = STUFF(( SELECT ', cast(' + QUOTENAME(Column_Name) + ' as bigint) as ' + QUOTENAME(Column_Name) FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE LIKE '%int' AND TABLE_NAME = @Table_Name ORDER BY COLUMN_NAME FOR XML PATH( '' ) ), 1, 2, '' ) -- Create PK column(s) SET @PkColumn = STUFF(( SELECT N ' + ' '|' ' + ' + ' cast(' + QUOTENAME(CU.COLUMN_NAME) + ' as nvarchar(max))' FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CU ON TC.TABLE_NAME = CU.TABLE_NAME AND TC.TABLE_SCHEMA = CU.TABLE_SCHEMA AND Tc.CONSTRAINT_NAME = CU.CONSTRAINT_NAME WHERE TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND TC.TABLE_SCHEMA = @Table_Schema AND TC.TABLE_NAME = @Table_Name ORDER BY CU.COLUMN_NAME FOR XML PATH( '' ) ), 1, 9, '' ) IF @PkColumn IS NULL SELECT @PkColumn = 'cast(NULL as nvarchar(max))' -- set select statement using dynamic UNPIVOT SET @SQL = 'select *, ' + QUOTENAME(@Table_Schema, '' '' ) + 'as [Table Schema], ' + QUOTENAME(@Table_Name, '' '' ) + ' as [Table Name]' + ' from (select ' + @PkColumn + ' as [PK Column], ' + @Cols + ' from ' + QUOTENAME(@Table_Schema) + '.' + QUOTENAME(@Table_Name) + ' )src UNPIVOT ([Column Value] for [Column Name] IN (' + @Columns + ')) unpvt WHERE [Column Value] = @SearchValue' -- print @SQL -- if we get errors, we may want to print generated SQL INSERT #RESULT ( [PK COLUMN] , [COLUMN VALUE] , [COLUMN Name] , [TABLE SCHEMA] , [TABLE Name] ) EXECUTE sp_ExecuteSQL @SQL, N '@SearchValue int' , @SearchValue PRINT 'Found ' + CAST(@@ROWCOUNT AS VARCHAR(10)) + ' records in ' + QUOTENAME(@Table_Schema) + '.' + QUOTENAME(@Table_Name) END CLOSE curAllTables DEALLOCATE curAllTables SELECT * FROM #RESULT ORDER BY [TABLE SCHEMA] , [TABLE Name] END </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <code> USE [NORTHWIND] GO /****** Object: StoredProcedure [dbo].[My_Search_Int_AllTables] Script Date: 09/25/2011 15:48:29 ******/ SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO CREATE PROC [dbo].[My_Search_Int_AllTables] ( @SearchValue INT ) AS BEGIN CREATE TABLE #RESULT ([PK COLUMN] NVARCHAR(MAX), [COLUMN VALUE] NVARCHAR(MAX), [COLUMN Name] sysname, [TABLE SCHEMA] sysname, [TABLE Name] sysname) DECLARE @Table_Name sysname, @Table_Schema sysname DECLARE curAllTables CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR SELECT Table_Schema, Table_Name FROM INFORMATION_SCHEMA.Tables WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY Table_Schema, Table_Name OPEN curAllTables FETCH curAllTables INTO @Table_Schema, @Table_Name WHILE (@@FETCH_STATUS = 0) -- Loop through all tables in the database BEGIN INSERT #RESULT EXECUTE My_Search_StringInGivenTable @SearchValue, @Table_Schema, @Table_Name FETCH curAllTables INTO @Table_Schema, @Table_Name END -- while CLOSE curAllTables DEALLOCATE curAllTables -- Return results SELECT * FROM #RESULT ORDER BY [Table Name] END </code> |
代码如下:
1 2 3 4 5 6 7 8 9 | <code> USE [NORTHWIND] GO DECLARE @return_value int EXEC @return_value = [dbo].[My_Search_Int_AllTables] @SearchValue = 68 SELECT 'Return Value' = @return_value GO </code> |
注:关于SQL Server 在指定数据库的所有表的所有列中搜索给定的值的内容就先介绍到这里,更多相关文章的可以留意
代码注释