Share Pastebin
Guest
Public paste!

Bergius

By: a guest | May 14th, 2008 | Syntax: SQL | Size: 3.23 KB | Hits: 187 | Expires: Never
Copy text to clipboard
  1. --
  2. -- Finds data in NTEXT/TEXT/NVARCHAR/VARCHAR columns and lists table and column names
  3. -- Usage: find_tables_and_columns 'text to find'
  4. --    or: find_tables_and_columns @search_string = 'text to find', @keep_data = 1
  5. --
  6. CREATE PROCEDURE find_tables_and_columns
  7.         @search_string varchar(255) = NULL,
  8.         @keep_data bit = 0
  9. AS
  10.         SET NOCOUNT ON
  11.  
  12.         DECLARE @report_table varchar(255), @timestamp varchar(12)
  13.        
  14.         SET @timestamp = REPLACE(REPLACE(REPLACE(convert(varchar, getdate(), 20), ':', ''), '-', ''), ' ', '')
  15.         SET @report_table = 'find_tables_and_columns_' + @timestamp
  16.        
  17.         IF (@search_string IS NULL)
  18.                 SET @search_string = '<script'
  19.        
  20.         -- create report table
  21.         EXEC('IF NOT EXISTS(SELECT name FROM sysobjects WHERE name = ''' + @report_table + ''' AND xtype=''U'') CREATE TABLE [' + @report_table + '] (table_name varchar(255), column_name varchar(255))')
  22.        
  23.         -- truncate report table
  24.         EXEC('DELETE FROM [' + @report_table + ']')
  25.        
  26.         -- find all tables and columns of types ntext, text, nvarchar and varchar
  27.         DECLARE @T varchar(255),@C varchar(255)
  28.         DECLARE Table_Cursor CURSOR FOR
  29.                 SELECT a.name, b.name
  30.                 FROM sysobjects a, syscolumns b
  31.                 WHERE a.id = b.id
  32.                         AND a.xtype = 'u'
  33.                         AND (b.xtype = 99 OR b.xtype = 35 OR b.xtype = 231 OR b.xtype = 167)
  34.         OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T, @C
  35.  
  36.         -- loop through all tables and columns and see where data matches search string
  37.         WHILE (@@FETCH_STATUS = 0) BEGIN
  38.                 IF (@T != @report_table) -- ignore report table
  39.                         EXEC('IF (EXISTS(SELECT [' + @C + '] FROM [' + @T + '] WHERE [' + @C + '] LIKE ''%' + @search_string + '%'')) INSERT INTO [' + @report_table + '] (table_name, column_name) VALUES (''' + @T + ''', ''' + @C + ''')')
  40.                 FETCH NEXT FROM Table_Cursor INTO @T, @C
  41.         END
  42.  
  43.         CLOSE Table_Cursor
  44.         DEALLOCATE Table_Cursor
  45.        
  46.         SET NOCOUNT OFF
  47.  
  48.         -- output report
  49.         EXEC('SELECT table_name, column_name FROM [' + @report_table + ']')
  50.  
  51.         SET NOCOUNT ON
  52.        
  53.         -- drop data or select table name
  54.         IF (@keep_data = 0) BEGIN
  55.                 EXEC('DROP TABLE [' + @report_table + ']')
  56.         END
  57.         ELSE BEGIN
  58.                 SELECT @report_table AS report_table
  59.         END
  60. GO
  61.  
  62. --
  63. -- Finds data in NTEXT/TEXT/NVARCHAR/VARCHAR columns and outputs matching rows
  64. -- Usage: find_rows 'text to find'
  65. --
  66. CREATE PROCEDURE find_rows
  67.         @search_string varchar(255) = NULL
  68. AS
  69.         SET NOCOUNT ON
  70.  
  71.         IF (@search_string IS NULL)
  72.                 SET @search_string = '<script'
  73.        
  74.         -- find all tables and columns of types ntext, text, nvarchar and varchar
  75.         DECLARE @T varchar(255),@C varchar(255)
  76.         DECLARE Table_Cursor CURSOR FOR
  77.                 SELECT a.name, b.name
  78.                 FROM sysobjects a, syscolumns b
  79.                 WHERE a.id = b.id
  80.                         AND a.xtype = 'u'
  81.                         AND (b.xtype = 99 OR b.xtype = 35 OR b.xtype = 231 OR b.xtype = 167)
  82.         OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T, @C
  83.  
  84.         SET NOCOUNT OFF
  85.  
  86.         -- loop through all tables and columns and see where data matches search string
  87.         WHILE (@@FETCH_STATUS = 0) BEGIN
  88.                 EXEC('IF (EXISTS(SELECT [' + @C + '] FROM [' + @T + '] WHERE [' + @C + '] LIKE ''%' + @search_string + '%'')) SELECT ''' + @T + ''' AS tablename, ''' + @C + ''' AS columnname, * FROM [' + @T + '] WHERE [' + @C + '] LIKE ''%' + @search_string + '%''')
  89.                 FETCH NEXT FROM Table_Cursor INTO @T, @C
  90.         END
  91.  
  92.         CLOSE Table_Cursor
  93.         DEALLOCATE Table_Cursor
  94. GO