我需要了解以下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)
答案 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
函数是一种在[
和]
中包含表名和列名的方法,但是如果在数据库实现中更改了引号字符,它仍然可以工作