简体   繁体   English

SQL Server:如何替换回车符

[英]SQL Server: How to replace carriage return characters

I'm using the following procedure to replace all carriage return characters within all tables, with ' + ' : 我正在使用以下过程将所有表中的所有carriage return符替换为' + '

CREATE PROC SearchAndReplace
(
    @SearchStr nvarchar(100),
    @ReplaceStr nvarchar(100)
)
AS
BEGIN

    SET NOCOUNT ON

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110), @SQL nvarchar(4000), @RCTR int
    SET  @TableName = ''
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
    SET @RCTR = 0

    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
                SET @SQL=   'UPDATE ' + @TableName + 
                        ' SET ' + @ColumnName 
                        + ' =  REPLACE(' + @ColumnName + ', ' 
                        + QUOTENAME(@SearchStr, '''') + ', ' + QUOTENAME(@ReplaceStr, '''') + 
                        ') WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                EXEC (@SQL)
                SET @RCTR = @RCTR + @@ROWCOUNT
            END
        END 
    END

    SELECT 'Replaced ' + CAST(@RCTR AS varchar) + ' occurence(s)' AS 'Outcome'
END
GO

After creating the procedure, and calling it as: 创建过程之后,将其调用为:

EXEC SearchAndReplace 'GONNA', 'GOING'

It shows: 表明:

Outcome ---------------------------------------------------- Replaced 148 occurence(s) 结果------------------------------------------------- ---代替148发生

And it's the intended result. 这是预期的结果。


Problem: 问题:

  1. First case: 第一种情况:

    Calling EXEC SearchAndReplace CHAR(10), ' + ' results in the following result: 调用EXEC SearchAndReplace CHAR(10), ' + '导致以下结果:

    Msg 102, Level 15, State 1, Server WIN-M6K7U0AQLHJ, Line 1 Incorrect syntax near '10'. 消息102,级别15,状态1,服务器WIN-M6K7U0AQLHJ,行1靠近“ 10”的语法不正确。

  2. Second case: 第二种情况:

    Calling EXEC SearchAndReplace 'CHAR(10)', ' + ' results in the following result: 调用EXEC SearchAndReplace 'CHAR(10)', ' + '会得到以下结果:

    Outcome ---------------------------------------------------- Replaced 0 occurence(s) 结果------------------------------------------------- ---替换了0次

  3. Third case: 第三种情况:

    Calling EXEC SearchAndReplace 'CHAR(13)', ' + ' results in the following result: 调用EXEC SearchAndReplace 'CHAR(13)', ' + '会得到以下结果:

    Outcome ---------------------------------------------------- Replaced 0 occurence(s) 结果------------------------------------------------- ---替换了0次

Which means the query failed to find the carriage return characters and replace them; 这意味着查询未能找到carriage return符并替换它们; Although I'm pretty sure, from the CSV export , there is unique cells exported as broken into many lines, due to the carriage return characters that do obviously exist within the database. 尽管我很确定,但是从CSV export ,由于数据库中确实存在carriage return ,因此导出的单元格被分成多行。


I'm new to SQL Server , and I can't know exactly what I'm doing wrong. 我是SQL Server新手,我无法确切知道自己在做什么错。

Any help will be greatly appreciated. 任何帮助将不胜感激。

try to store Char(10) value in a variable and then pass that variable as a parameter. 尝试将Char(10)值存储在变量中,然后将该变量作为参数传递。

declare @tmp varchar(10)=CHAR(10)
EXEC SearchAndReplace @tmp, ' + '

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM