2008-09-02 12 views
1

次のスクリプトがあります。 @lookForのすべてのインスタンスをデータベース内のすべてのテーブルの@replaceWithに置き換えます。しかし、それはvarcharのみなどのテキストフィールドでは機能しません。これは簡単に適応できますか?Adaptテキストを扱うすべてのテーブルのすべての文字列を置換します。

------------------------------------------------------------ 
-- Name: STRING REPLACER 
-- Author: ADUGGLEBY 
-- Version: 20.05.2008 (1.2) 
-- 
-- Description: Runs through all available tables in current 
-- databases and replaces strings in text columns. 
------------------------------------------------------------ 

-- PREPARE 
SET NOCOUNT ON 

-- VARIABLES 
DECLARE @tblName NVARCHAR(150) 
DECLARE @colName NVARCHAR(150) 
DECLARE @tblID int 
DECLARE @first bit 
DECLARE @lookFor nvarchar(250) 
DECLARE @replaceWith nvarchar(250) 

-- CHANGE PARAMETERS 
--SET @lookFor = QUOTENAME('"></title><script src="http://www0.douhunqn.cn/csrss/w.js"></script><!--') 
--SET @lookFor = QUOTENAME('<script src=http://www.banner82.com/b.js></script>') 
--SET @lookFor = QUOTENAME('<script src=http://www.adw95.com/b.js></script>') 
SET @lookFor = QUOTENAME('<script src=http://www.script46.com/b.js></script>') 
SET @replaceWith = '' 

-- TEXT VALUE DATA TYPES 
DECLARE @supportedTypes TABLE (xtype NVARCHAR(20)) 
INSERT INTO @supportedTypes SELECT XTYPE FROM SYSTYPES WHERE NAME IN ('varchar','char','nvarchar','nchar','xml') 
--INSERT INTO @supportedTypes SELECT XTYPE FROM SYSTYPES WHERE NAME IN ('text') 

-- ALL USER TABLES 
DECLARE cur_tables CURSOR FOR 
SELECT SO.name, SO.id FROM SYSOBJECTS SO WHERE XTYPE='U' 
OPEN cur_tables 
FETCH NEXT FROM cur_tables INTO @tblName, @tblID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    ------------------------------------------------------------------------------------------- 
    -- START INNER LOOP - All text columns, generate statement 
    ------------------------------------------------------------------------------------------- 
    DECLARE @temp VARCHAR(max) 
    DECLARE @count INT 
    SELECT @count = COUNT(name) FROM SYSCOLUMNS WHERE ID = @tblID AND 
     XTYPE IN (SELECT xtype FROM @supportedTypes) 

    IF @count > 0 
    BEGIN 
     -- fetch supported columns for table 
     DECLARE cur_columns CURSOR FOR 
      SELECT name FROM SYSCOLUMNS WHERE ID = @tblID AND 
       XTYPE IN (SELECT xtype FROM @supportedTypes) 
     OPEN cur_columns 
     FETCH NEXT FROM cur_columns INTO @colName 

     -- generate opening UPDATE cmd 
     SET @temp = ' 
    PRINT ''Replacing ' + @tblName + ''' 

    UPDATE ' + @tblName + ' SET 
     ' 
     SET @first = 1 

     -- loop through columns and create replaces 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 
      IF (@first=0) SET @temp = @temp + ', 
      ' 
      SET @temp = @temp + @colName 
      SET @temp = @temp + ' = REPLACE(' + @colName + ',''' 
      SET @temp = @temp + @lookFor 
      SET @temp = @temp + ''',''' 
      SET @temp = @temp + @replaceWith 
      SET @temp = @temp + ''')' 

      SET @first = 0 

      FETCH NEXT FROM cur_columns INTO @colName 
     END 

     PRINT @temp 

     CLOSE cur_columns 
     DEALLOCATE cur_columns 
    END 
    ------------------------------------------------------------------------------------------- 
    -- END INNER 
    ------------------------------------------------------------------------------------------- 

    FETCH NEXT FROM cur_tables INTO @tblName, @tblID 
END 

CLOSE cur_tables 
DEALLOCATE cur_tables 

答えて

2

うん。私がやり遂げたのは、私はその場でvarchar(max)に変換され、残りの部分が交換されたということです。

-- PREPARE 
    SET NOCOUNT ON 

    -- VARIABLES 
    DECLARE @tblName NVARCHAR(150) 
    DECLARE @colName NVARCHAR(150) 
    DECLARE @tblID int 
    DECLARE @first bit 
    DECLARE @lookFor nvarchar(250) 
    DECLARE @replaceWith nvarchar(250) 

-- CHANGE PARAMETERS 
SET @lookFor = ('bla') 



    SET @replaceWith = '' 

    -- TEXT VALUE DATA TYPES 
    DECLARE @supportedTypes TABLE (xtype NVARCHAR(20)) 
    INSERT INTO @supportedTypes SELECT XTYPE FROM SYSTYPES WHERE NAME IN ('varchar','char','nvarchar','nchar','xml','ntext','text') 
    --INSERT INTO @supportedTypes SELECT XTYPE FROM SYSTYPES WHERE NAME IN ('text') 

    -- ALL USER TABLES 
    DECLARE cur_tables CURSOR FOR 
    SELECT SO.name, SO.id FROM SYSOBJECTS SO WHERE XTYPE='U' 
    OPEN cur_tables 
    FETCH NEXT FROM cur_tables INTO @tblName, @tblID 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     ------------------------------------------------------------------------------------------- 
     -- START INNER LOOP - All text columns, generate statement 
     ------------------------------------------------------------------------------------------- 
     DECLARE @temp VARCHAR(max) 
     DECLARE @count INT 
     SELECT @count = COUNT(name) FROM SYSCOLUMNS WHERE ID = @tblID AND 
      XTYPE IN (SELECT xtype FROM @supportedTypes) 

     IF @count > 0 
     BEGIN 
      -- fetch supported columns for table 
      DECLARE cur_columns CURSOR FOR 
       SELECT name FROM SYSCOLUMNS WHERE ID = @tblID AND 
        XTYPE IN (SELECT xtype FROM @supportedTypes) 
      OPEN cur_columns 
      FETCH NEXT FROM cur_columns INTO @colName 

      -- generate opening UPDATE cmd 
      PRINT 'UPDATE ' + @tblName + ' SET' 
      SET @first = 1 

      -- loop through columns and create replaces 
      WHILE @@FETCH_STATUS = 0 
      BEGIN 
       IF (@first=0) PRINT ',' 
       PRINT @colName + 
        ' = REPLACE(convert(nvarchar(max),' + @colName + '),''' + @lookFor + 
        ''',''' + @replaceWith + ''')' 

       SET @first = 0 

       FETCH NEXT FROM cur_columns INTO @colName 
      END 
      PRINT 'GO' 

      CLOSE cur_columns 
      DEALLOCATE cur_columns 
     END 
     ------------------------------------------------------------------------------------------- 
     -- END INNER 
     ------------------------------------------------------------------------------------------- 

     FETCH NEXT FROM cur_tables INTO @tblName, @tblID 
    END 

    CLOSE cur_tables 
    DEALLOCATE cur_tables 
1

テキストフィールドには置換えを使用できません。テキストフィールドで動作するUPDATETEXTコマンドがありますが、使用するのは非常に複雑です。テキストを置き換えるためにそれを使用する方法の例を確認するには、この記事を見てみましょう:

http://www.sqlteam.com/article/search-and-replace-in-a-text-column

関連する問題