Sql server SQL Server:如何替换回车符

Sql server SQL Server:如何替换回车符,sql-server,special-characters,string-formatting,carriage-return,Sql Server,Special Characters,String Formatting,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 nva

我使用以下过程将所有表中的所有
回车
字符替换为
“+”

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
创建过程并将其称为:

EXEC SearchAndReplace'good'、'GOING'

它表明:

结果 ----------------------------------------------------替换148个事件

这是预期的结果


问题:
  • 第一种情况:

    调用EXEC SearchAndReplace CHAR(10),“+”将导致 结果如下:

    Msg 102,15级,状态1,服务器WIN-M6K7U0AQLHJ,第1行不正确 “10”附近的语法

  • 第二种情况:

    调用EXEC SearchAndReplace'CHAR(10)'+'会导致 结果如下:

    结果 ----------------------------------------------------已替换0个事件

  • 第三种情况:

    调用EXEC SearchAndReplace'CHAR(13)'+'会导致 结果如下:

    结果 ----------------------------------------------------已替换0个事件

  • 这意味着查询无法找到
    回车符
    字符并替换它们;尽管我很确定,从
    CSV导出
    ,由于
    回车
    字符明显存在于数据库中,因此导出的单元格是唯一的,可以分成许多行


    我是SQL Server的新手,不知道自己到底做错了什么

    任何帮助都将不胜感激。

    尝试将
    Char(10)
    值存储在变量中,然后将该变量作为参数传递

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

    不能在存储过程调用中使用表达式。只允许使用文字和变量。当然,使用参数
    'CHAR(10)
    调用过程是允许的,但它会搜索确切的字符串文本
    C
    H
    A
    1
    <0
    ——这显然不在您的数据中。请注意,SQL Server将接受字符串形式的文本回车符(如中所示,在打开
    ”后按ENTER键),但这对读者来说非常混乱。