|
9 | 9 | --Here is the complete stored procedure code: |
10 | 10 |
|
11 | 11 |
|
12 | | -CREATE PROC [dbo].[SearchAllTables] |
| 12 | +IF OBJECT_ID('[dbo].[SearchAllTables]', 'P') IS NOT NULL |
| 13 | + DROP PROCEDURE [dbo].[SearchAllTables] |
| 14 | +GO |
| 15 | + |
| 16 | +-- Create a stored procedure called [dbo].[SearchAllTables] |
| 17 | +CREATE PROCEDURE [dbo].[SearchAllTables] |
13 | 18 | ( |
14 | | - @SearchStr nvarchar(100) |
| 19 | + @SearchStr NVARCHAR(100) -- Input parameter to search for a specific string |
15 | 20 | ) |
16 | 21 | AS |
17 | 22 | BEGIN |
| 23 | + SET NOCOUNT ON; |
| 24 | + |
| 25 | + -- Create a temporary table to store the search results |
| 26 | + CREATE TABLE #Results (TableName NVARCHAR(256), ColumnName NVARCHAR(128), ColumnValue NVARCHAR(MAX), RowNumber INT); |
18 | 27 |
|
19 | | - -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved. |
20 | | - -- Purpose: To search all columns of all tables for a given search string |
21 | | - -- Written by: Narayana Vyas Kondreddi |
22 | | - -- Site: http://vyaskn.tripod.com |
23 | | - -- Tested on: SQL Server 7.0 and SQL Server 2000 |
24 | | - -- Date modified: 28th July 2002 22:50 GMT |
| 28 | + -- Declare variables to store table and column names, and construct the search string |
| 29 | + DECLARE @TableName NVARCHAR(256), @ColumnName NVARCHAR(128), @SearchStr2 NVARCHAR(110); |
| 30 | + SET @SearchStr2 = '%' + @SearchStr + '%'; -- Add wildcard characters to search string |
25 | 31 |
|
| 32 | + -- Declare a dynamic SQL variable to build the dynamic SQL statement |
| 33 | + DECLARE @DynamicSQL NVARCHAR(MAX) = N''; |
26 | 34 |
|
27 | | - CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) |
| 35 | + -- Build the dynamic SQL statement to search for the specified string in all tables and columns |
| 36 | + SELECT @DynamicSQL += |
| 37 | + N'INSERT INTO #Results (TableName, ColumnName, ColumnValue, RowNumber) ' + |
| 38 | + N'SELECT ''' + QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME) + ''', ' + |
| 39 | + N'''' + QUOTENAME(c.COLUMN_NAME) + ''', ' + |
| 40 | + N'CAST(' + QUOTENAME(c.COLUMN_NAME) + ' AS NVARCHAR(MAX)), ' + |
| 41 | + N'ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) ' + |
| 42 | + N'FROM ' + QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME) + ' (NOLOCK) ' + |
| 43 | + N'WHERE ' + QUOTENAME(c.COLUMN_NAME) + ' LIKE @SearchStr2; ' |
| 44 | + FROM INFORMATION_SCHEMA.TABLES t |
| 45 | + INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA |
| 46 | + WHERE t.TABLE_TYPE = 'BASE TABLE' |
| 47 | + AND c.DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'uniqueidentifier') |
| 48 | + AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(t.TABLE_SCHEMA) + '.' + QUOTENAME(t.TABLE_NAME)), 'IsMSShipped') = 0; |
28 | 49 |
|
29 | | - SET NOCOUNT ON |
| 50 | + -- Get the total number of tables |
| 51 | + DECLARE @TotalTables INT = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'); |
30 | 52 |
|
31 | | - DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) |
32 | | - SET @TableName = '' |
33 | | - SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') |
| 53 | + -- Initialize the counter variables |
| 54 | + DECLARE @Counter INT = 0, @Progress INT = 0; |
34 | 55 |
|
35 | | - WHILE @TableName IS NOT NULL |
36 | | - BEGIN |
37 | | - SET @ColumnName = '' |
38 | | - SET @TableName = |
39 | | - ( |
40 | | - SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) |
41 | | - FROM INFORMATION_SCHEMA.TABLES |
42 | | - WHERE TABLE_TYPE = 'BASE TABLE' |
43 | | - AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName |
44 | | - AND OBJECTPROPERTY( |
45 | | - OBJECT_ID( |
46 | | - QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) |
47 | | - ), 'IsMSShipped' |
48 | | - ) = 0 |
49 | | - ) |
| 56 | + -- Execute the dynamic SQL statement using sp_executesql with the search string parameter |
| 57 | + EXEC sp_executesql @DynamicSQL, N'@SearchStr2 NVARCHAR(110)', @SearchStr2 = @SearchStr2; |
50 | 58 |
|
51 | | - WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) |
52 | | - BEGIN |
53 | | - SET @ColumnName = |
54 | | - ( |
55 | | - SELECT MIN(QUOTENAME(COLUMN_NAME)) |
56 | | - FROM INFORMATION_SCHEMA.COLUMNS |
57 | | - WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) |
58 | | - AND TABLE_NAME = PARSENAME(@TableName, 1) |
59 | | - AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'uniqueidentifier') |
60 | | - AND QUOTENAME(COLUMN_NAME) > @ColumnName |
61 | | - ) |
62 | | - |
63 | | - IF @ColumnName IS NOT NULL |
64 | | - BEGIN |
65 | | - INSERT INTO #Results |
66 | | - EXEC |
67 | | - ( |
68 | | - 'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) |
69 | | - FROM ' + @TableName + ' (NOLOCK) ' + |
70 | | - ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 |
71 | | - |
72 | | - ) |
73 | | - --Print @TableName |
74 | | - END |
75 | | - END |
76 | | - END |
| 59 | + -- Select the search results from the temporary table |
| 60 | + SELECT TableName, ColumnName, ColumnValue, RowNumber FROM #Results; |
77 | 61 |
|
78 | | - SELECT ColumnName, ColumnValue FROM #Results |
| 62 | + -- Drop the temporary table |
| 63 | + DROP TABLE #Results; |
79 | 64 | END |
0 commit comments