1234" /> 1234" /> 1234" />

首页 / 知识

关于sql:如何在MsSQL中执行简单的”查找并替换”?

2023-04-15 03:06:00

关于sql:如何在MsSQL中执行简单的”查找并替换”?

How do I do a simple 'Find and Replace" in MsSQL?

问题是不言而喻的。我想做一个简单的查找和替换,就像在文本编辑器中对数据库的列(在MS Windows Server 2003上为MySQL)中的数据进行处理一样。


以下查询将每个a字符替换为b字符。

1
2
3
4
5
6
UPDATE
    YourTable
SET
    Column1 = REPLACE(Column1,'a','b')
WHERE
    Column1 LIKE '%a%'

这不适用于SQL Server2003。


像这样:

1
2
3
4
BEGIN TRANSACTION;
UPDATE TABLE_NAME
  SET column_name=REPLACE(column_name,'text_to_find','replace_with_this');
COMMIT TRANSACTION;

示例:将

Argument data type ntext is invalid for argument 1 of replace
function.

最简单的解决方法是在替换期间强制转换列,如果您的列数据适合在nvarchar之内。从接受的答案中借用代码:

1
2
3
UPDATE YourTable
SET Column1 = REPLACE(CAST(Column1 AS nvarchar(MAX)),'a','b')
WHERE Column1 LIKE '%a%'

这对我来说非常有效。感谢此论坛帖子,我找到了解决方法。希望这对其他人有帮助!


以下内容将在您连接到的实例的每个表的每个数据库(系统数据库除外)中查找并替换一个字符串:

只需将'Search String'更改为要查找的内容,然后将'Replace String'更改为要替换的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
--Getting all the databases and making a cursor
DECLARE db_cursor CURSOR FOR  
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')  -- exclude these databases

DECLARE @databaseName nvarchar(1000)
--opening the cursor to move over the databases in this instance
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @databaseName  

WHILE @@FETCH_STATUS = 0  
BEGIN
    PRINT @databaseName
    --Setting up temp table for the results of our search
    DECLARE @Results TABLE(TableName nvarchar(370), RealColumnName nvarchar(370), ColumnName nvarchar(370), ColumnValue nvarchar(3630))

    SET NOCOUNT ON

    DECLARE @SearchStr nvarchar(100), @ReplaceStr nvarchar(100), @SearchStr2 nvarchar(110)
    SET @SearchStr = 'Search String'
    SET @ReplaceStr = 'Replace String'
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128)
    SET  @TableName = ''

    --Looping over all the tables in the database
    WHILE @TableName IS NOT NULL
    BEGIN
        DECLARE @SQL nvarchar(2000)
        SET @ColumnName = ''
        DECLARE @RESULT NVARCHAR(256)
        SET @SQL = 'USE ' + @databaseName + '
            SELECT @result = MIN(QUOTENAME(TABLE_SCHEMA) + '
'.'' + QUOTENAME(TABLE_NAME))
            FROM    ['
+ @databaseName + '].INFORMATION_SCHEMA.TABLES
            WHERE       TABLE_TYPE = '
'BASE TABLE'' AND TABLE_CATALOG = ''' + @databaseName + '''
                AND QUOTENAME(TABLE_SCHEMA) + '
'.'' + QUOTENAME(TABLE_NAME) > ''' + @TableName + '''
                AND OBJECTPROPERTY(
                        OBJECT_ID(
                            QUOTENAME(TABLE_SCHEMA) + '
'.'' + QUOTENAME(TABLE_NAME)
                                ), '
'IsMSShipped''
                                ) = 0'

        EXEC master..sp_executesql @SQL, N'@result nvarchar(256) out', @RESULT OUT

        SET @TableName = @RESULT
        PRINT @TableName

        WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
        BEGIN
            DECLARE @ColumnResult NVARCHAR(256)
            SET @SQL = '
                SELECT @ColumnResult = MIN(QUOTENAME(COLUMN_NAME))
                FROM    ['
+ @databaseName + '].INFORMATION_SCHEMA.COLUMNS
                WHERE       TABLE_SCHEMA    = PARSENAME('
'[' + @databaseName + '].' + @TableName + ''', 2)
                    AND TABLE_NAME  = PARSENAME('
'[' + @databaseName + '].' + @TableName + ''', 1)
                    AND DATA_TYPE IN ('
'char'', ''varchar'', ''nchar'', ''nvarchar'')
                    AND TABLE_CATALOG = '
'' + @databaseName + '''
                    AND QUOTENAME(COLUMN_NAME) > '
'' + @ColumnName + ''''
            PRINT @SQL
            EXEC master..sp_executesql @SQL, N'@ColumnResult nvarchar(256) out', @ColumnResult OUT
            SET @ColumnName = @ColumnResult

            PRINT @ColumnName

            IF @ColumnName IS NOT NULL
            BEGIN
                INSERT INTO @Results
                EXEC
                (
                    'USE ' + @databaseName + '
                    SELECT '
'' + @TableName + ''',''' + @ColumnName + ''',''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
                    FROM '
+ @TableName + ' (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                )
            END
        END
    END

    --Declaring another temporary table
    DECLARE @time_to_update TABLE(TableName nvarchar(370), RealColumnName nvarchar(370))

    INSERT INTO @time_to_update
    SELECT TableName, RealColumnName FROM @Results GROUP BY TableName, RealColumnName

    DECLARE @MyCursor CURSOR;
    BEGIN
        DECLARE @t nvarchar(370)
        DECLARE @c nvarchar(370)
        --Looping over the search results  
        SET @MyCursor = CURSOR FOR
        SELECT TableName, RealColumnName FROM @time_to_update GROUP BY TableName, RealColumnName

        --Getting my variables from the first item
        OPEN @MyCursor
        FETCH NEXT FROM @MyCursor
        INTO @t, @c

        WHILE @@FETCH_STATUS = 0
        BEGIN
            -- Updating the old values with the new value
            DECLARE @sqlCommand VARCHAR(1000)
            SET @sqlCommand = '
                USE '
+ @databaseName + '
                UPDATE ['
+ @databaseName + '].' + @t + ' SET ' + @c + ' = REPLACE(' + @c + ', ''' + @SearchStr + ''', ''' + @ReplaceStr + ''')
                WHERE '
+ @c + ' LIKE ''' + @SearchStr2 + ''''
            PRINT @sqlCommand
            BEGIN TRY
                EXEC (@sqlCommand)
            END TRY
            BEGIN CATCH
                PRINT ERROR_MESSAGE()
            END CATCH

            --Getting next row values
            FETCH NEXT FROM @MyCursor
            INTO @t, @c
        END;

        CLOSE @MyCursor ;
        DEALLOCATE @MyCursor;
    END;

    DELETE FROM @time_to_update
    DELETE FROM @Results

    FETCH NEXT FROM db_cursor INTO @databaseName
END  

CLOSE db_cursor  
DEALLOCATE db_cursor

注意:这不是理想的,也不是优化的


如果您使用的是SQL Server 2005或更高版本,则http://www.sqlsharp.com/上还有一个CLR库,该库提供.NET实现的字符串和RegEx函数,具体取决于您的数量和类型。数据可能更易于使用,并且在某些情况下,.NET字符串处理功能可能比T-SQL更为有效。


替换查找执行数据库

最新内容

相关内容

猜你喜欢