sql-query,查找并替换此特定代码

时间:2017-11-16 15:57:29

标签: sql select replace union

我需要了解以下SQL查询,并想询问是否有人可以向我详细解释(如xml路径)以及使用replace元素更新它? 所以我想用BlaBlaBlaBla找到所有值,并用HaHaHaHa替换它们。目前查询只查找BlaBlaBlaBla的所有值。

DECLARE @searchstring  NVARCHAR(255)
SET @searchstring = '%BlaBlaBlaBla%'

DECLARE @sql NVARCHAR(max)

SELECT @sql = STUFF((
  SELECT 
    ' UNION ALL SELECT ''' + TABLE_SCHEMA + '.' + TABLE_NAME + ''' AS tbl, ''' + COLUMN_NAME + ''' AS col, [' + COLUMN_NAME + '] AS val' + 
    ' FROM [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] WHERE [' + COLUMN_NAME + '] LIKE ''' + @searchstring + ''''
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE DATA_TYPE in ('nvarchar', 'varchar', 'char', 'ntext') FOR XML PATH('')) ,1, 11, '')

Exec (@sql)

1 个答案:

答案 0 :(得分:0)

我相信XML PATH是让所有字符串连接在一起的技巧。

您可以使用以下内容将其更改为REPLACE

SELECT @sql = 
SELECT
    ' UPDATE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + '
      SET ' + QUOTENAME(COLUMN_NAME) + ' = REPLACE(' + QUOTENAME(COLUMN_NAME) + ', ''' + @search_string + ''', ' + ', ''' + @replace_string + '''
      WHERE ' + QUOTENAME(COLUMN_NAME) + ' LIKE ''' + @searchstring + ''''
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE
    DATA_TYPE in ('nvarchar', 'varchar', 'char', 'ntext') FOR XML PATH('')

EXEC(@sql)

一些警告:

我还没有测试过这个。当您生成这样的代码时,很容易使用所有的开始和结束引号等产生小错误。我会打印出SQL并检查它,根据需要重复直到获得输出SQL正确。

此外,这通常不是一个好主意。如果您的数据库很大和/或具有大量表,那么性能将会很糟糕。您通常应该分析您认为此类数据将出现在何处,并编写将根据需要进行更正的代码。在整个数据中将数据元素隐藏在字符串中这一事实令人担忧。

最后,请注意,这可能会轻松更新您不打算更新的其他数据。如果您尝试更新" 123"用" 456"那里有一个字符串是"我的ID是1234"它将成为"我的ID是4564"。

顺便说一句,QUOTENAME函数是一种在[]中包含表名和列名的方法,但是如果在数据库实现中更改了引号字符,它仍然可以工作