Files
sql-scripts/DBG - Search a string in all tables.sql
Thierry Schork 42fb2e851c cleanup
2023-01-05 11:32:51 +01:00

98 lines
3.9 KiB
Transact-SQL

/*=============================================================================
Search for a given text in all varchar / nvarchar / text / ntext fields in the current db
Derived from https://social.technet.microsoft.com/wiki/contents/articles/24169.sql-server-searching-all-columns-in-a-table-for-a-string.aspx
Creation : 28.12.2022 / TSC
Modifications:
=============================================================================*/
--#region setup
IF OBJECT_ID('TempDB..#Result', N'U') IS NOT NULL
DROP TABLE #Result;
CREATE TABLE #RESULT ([PK COLUMN] NVARCHAR(MAX), [COLUMN VALUE] NVARCHAR(MAX), [COLUMN Name] sysname, [TABLE SCHEMA] sysname, [TABLE Name] sysname);
DECLARE @Table_Name sysname, @SearchString NVARCHAR(MAX), @Table_Schema sysname;
DECLARE @Columns NVARCHAR(MAX), @Cols NVARCHAR(MAX), @PkColumn NVARCHAR(MAX);
--#endregion
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET @SearchString = N'49300';
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)
BEGIN
-- 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 AND [TABLE_SCHEMA] = @Table_Schema
ORDER BY [COLUMN_NAME]
FOR XML PATH('')),1,2,'');
IF @Columns IS NOT NULL
BEGIN
-- 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)) COLLATE DATABASE_DEFAULT AS ' + QUOTENAME([COLUMN_NAME])
FROM [INFORMATION_SCHEMA].[COLUMNS]
WHERE [DATA_TYPE] IN ('text','ntext','varchar','nvarchar','char','nchar')
AND [TABLE_NAME] = @Table_Name AND [TABLE_SCHEMA] = @Table_Schema
ORDER BY [COLUMN_NAME]
FOR XML PATH('')),1,2,'');
SET @PkColumn = STUFF((SELECT N' + ''|'' + ' + ' CAST(' + QUOTENAME(CU.[COLUMN_NAME]) + ' AS nvarchar(max)) COLLATE DATABASE_DEFAULT '
FROM [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] AS TC
INNER JOIN [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] AS CU
ON TC.[CONSTRAINT_TYPE] = 'PRIMARY KEY'
AND TC.[CONSTRAINT_NAME] = CU.[CONSTRAINT_NAME]
WHERE TC.[TABLE_SCHEMA] = @Table_Schema
AND TC.[TABLE_NAME] = @Table_Name
ORDER BY CU.[ORDINAL_POSITION]
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 = '
INSERT #RESULT ([PK COLUMN], [Column Value], [Column Name], [Table Schema], [Table Name])
SELECT unpvt.[PK Column]
, unpvt.[Column Value]
, unpvt.[Column Name]
, ' + 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] LIKE ''%'' + @SearchString + ''%'';
';
--print @SQL
EXECUTE sp_ExecuteSQL @SQL, N'@SearchString nvarchar(max)', @SearchString;
END;
FETCH curAllTables
INTO @Table_Schema, @Table_Name;
END; -- while
CLOSE curAllTables;
DEALLOCATE curAllTables;
-- Return results
SELECT * FROM #RESULT ORDER BY [Table Name];
GO