簡體   English   中英

SQL Server:如何替換回車符

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

我正在使用以下過程將所有表中的所有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

創建過程之后,將其調用為:

EXEC SearchAndReplace 'GONNA', 'GOING'

表明:

結果------------------------------------------------- ---代替148發生

這是預期的結果。


問題:

  1. 第一種情況:

    調用EXEC SearchAndReplace CHAR(10), ' + '導致以下結果:

    消息102,級別15,狀態1,服務器WIN-M6K7U0AQLHJ,行1靠近“ 10”的語法不正確。

  2. 第二種情況:

    調用EXEC SearchAndReplace 'CHAR(10)', ' + '會得到以下結果:

    結果------------------------------------------------- ---替換了0次

  3. 第三種情況:

    調用EXEC SearchAndReplace 'CHAR(13)', ' + '會得到以下結果:

    結果------------------------------------------------- ---替換了0次

這意味着查詢未能找到carriage return符並替換它們; 盡管我很確定,但是從CSV export ,由於數據庫中確實存在carriage return ,因此導出的單元格被分成多行。


我是SQL Server新手,我無法確切知道自己在做什么錯。

任何幫助將不勝感激。

嘗試將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