2010-12-23 3 views
2

Umgebung: Windows, SQL Server 2008Wie schreibe ich SQL-Skript, um Zeilen in allen Tabellen einer SQL Server-Datenbank zu finden, die eine Zeichenfolgespalte haben, deren Wert einem Schlüsselwort entspricht?

Zum Beispiel meiner Datenbank hat Tabelle 1, Tabelle 2, Tabelle 3 ... TableN hat jede Tabelle Column1, Column2, Column3 ... ColumnN. Einfach, sie sind alle String-Spalte.

Ich möchte Zeilen finden, egal aus welcher Tabelle, welche den Wert einer Spalte haben, ist 'Key' egal welche Spalte.

Wie schreibe ich ein Skript, das zu tun?

Danke!

Antwort

0

dies versuchen, aber das wird nur funktionieren auf ähnliche strukturierte Tabelle

DECLARE @Table nvarchar(100), @Column nvarchar(100) 
DECLARE @SQLStringBuilder nvarchar(MAX) = '' 
DECLARE MY_CURSOR Cursor 
FOR SELECT sysobjects.name, syscolumns.name 
    FROM sysobjects 
    JOIN syscolumns ON sysobjects.id = syscolumns.id 
    JOIN systypes ON syscolumns.xtype=systypes.xtype 
    WHERE sysobjects.xtype='U' and systypes.name <> 'sysname' and systypes.name = 'nvarchar' 
ORDER BY sysobjects.name,syscolumns.colid 
Open MY_CURSOR 

Fetch NEXT FROM MY_CURSOR INTO @Table, @Column 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @SQLStringBuilder = @SQLStringBuilder + ' SELECT ''' + @Table + ''' as TableName, ''' + @Column + ''' as ColumnName, * FROM ' + @Table + ' WHERE ' + @Column+ ' = ''Key'' UNION ALL' 

Fetch NEXT FROM MY_CURSOR INTO @Table, @Column 

END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 
SET @SQLStringBuilder = SUBSTRING(@SQLStringBuilder, 0, LEN(@SQLStringBuilder)-9) 
EXEC(@SQLStringBuilder) 
1
CREATE PROC SearchAllTables 
(
    @SearchStr nvarchar(100) 
) 
AS 
BEGIN 

DECLARE @SearchStr nvarchar(100) 
SET @SearchStr = 'Wound' 

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 
zu erhalten begonnen