none
SQL Newbie sucht hilfe RRS feed

  • Frage

  • Hallo

    Habe hier ein Script, welches alle Vorkommnisse eines Strings in der ganzen DB sucht und in einer Tabelle anzeigt.

    Nun soll das ganze auch noch gleich die gefundenen Strings (@SearchStr) durch einen anderen (@ReplaceStr) ersetzen.

    Dazu fehlt mir im Moment der Ansatz wo ich das am besten einpflanzen soll da ich noch etwas "Grün" bin in Sachen SQL. Der bestehende Code stammt nicht von mir.
    Hat mir jemand einen Tip?

    Vielen Dank
    Franz

    Sollte als attachment dazu ... ging irgendwie falsch ... sorry:

    ALTER PROC [dbo].[NF_SearchAllTables]
    (
        @SearchStr nvarchar(100),
        @ReplaceStr 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), @ReplaceStr2 nvarchar(110)
        SET  @TableName = ''
        SET @SearchStr2 = QUOTENAME(@SearchStr,'''')
        SET @ReplaceStr2 = QUOTENAME(@ReplaceStr,'''')
     
        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
     
     
    Dienstag, 15. Februar 2011 16:53

Antworten

  • Hallo Franz,

    IF @ColumnName IS NOT NULL
    BEGIN
      INSERT INTO #Results
      EXEC
      (
        ' SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)' +
        ' FROM ' + @TableName + ' (NOLOCK) ' +
        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
      )
    
      EXEC
      (
    	' UPDATE ' + @TableName + 
    	' SET ' + @ColumnName + ' = REPLACE(' + 
    		@ColumnName + 
    		', REPLACE(' + @SearchStr2 + ',''%'',''''),' + 
    		@ReplaceStr2 + ')' +
    	' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
      )
    END
    

    • Als Antwort vorgeschlagen Elmar Boye Mittwoch, 16. Februar 2011 08:10
    • Als Antwort markiert F. McLion Mittwoch, 16. Februar 2011 09:41
    Dienstag, 15. Februar 2011 20:40

Alle Antworten

  • Hallo Franz,

    IF @ColumnName IS NOT NULL
    BEGIN
      INSERT INTO #Results
      EXEC
      (
        ' SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)' +
        ' FROM ' + @TableName + ' (NOLOCK) ' +
        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
      )
    
      EXEC
      (
    	' UPDATE ' + @TableName + 
    	' SET ' + @ColumnName + ' = REPLACE(' + 
    		@ColumnName + 
    		', REPLACE(' + @SearchStr2 + ',''%'',''''),' + 
    		@ReplaceStr2 + ')' +
    	' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
      )
    END
    

    • Als Antwort vorgeschlagen Elmar Boye Mittwoch, 16. Februar 2011 08:10
    • Als Antwort markiert F. McLion Mittwoch, 16. Februar 2011 09:41
    Dienstag, 15. Februar 2011 20:40
  • Yury,

     

    Perfect!

    Vielen Dank. Funktioniert wunderbar. Nicht dass ich den Code genau verstehe ... ;-) ... aber es funktioniert.

    Dank und Gruss aus der Schweiz

    Franz

    Mittwoch, 16. Februar 2011 08:40