0

MS SQL 2008でストアドプロシージャを使用しています。
コードの問題は、UPDATEセクションのどこかにあります。単一引用符で始まる文字列を置き換えようとしています。

これが私が探している文字列です、そして私はそれを何にも置き換えたいと思います。これは、引用符のエスケープなどの問題でしょうか?

">%http%<!--

どうもありがとう。以下はストアドプロシージャです。

USE [cop_pcms]
GO
/****** Object:  StoredProcedure [dbo].[SearchAllTablesWildcard_Replace2]    Script    Date: 09/11/2012 11:33:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[SearchAllTablesWildcard_Replace2]
(
@SearchStr nvarchar(100)
)
AS
BEGIN


CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @SQL NVARCHAR(4000)

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

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
            INSERT INTO #Results
            EXEC
            (
                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)' +
                ' FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' like ' + @SearchStr2
            )
        END


        IF @ColumnName IS NOT NULL        
        BEGIN
            SET @SQL = 'UPDATE ' + @TableName + 
            ' SET ' + @ColumnName + ' = REPLACE(' + @ColumnName + ',' + @SearchStr2 + ',' + ''''')' +
            ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 
            EXEC(@SQL)
        END        

    END 
END

SELECT ColumnName, ColumnValue FROM #Results
 END
4

1 に答える 1

0

ご質問の内容がわかりにくいのですが...

二重引用符を置き換えるだけの場合、これはあなたが望むことをするはずです

select REPLACE('testing"testing','"','')

また、この例は、文字列 ">%http% を置き換えたい場合にも機能するはずです

select REPLACE('testing">%http%<!--testing','">%http%<!--','')

ただし、これは何もしません

select REPLACE('testing">**http**<!--testing','">%http%<!--','')

より明確にするために。これもそれをしません...注:%は「パターン」のワイルドカードではありません

select REPLACE('1111a23333','1a%3','')

また、QUOTENAME(TABLE_NAME) は角括弧で囲みますが、これはあなたが考えていることだと思いますか?

だから多分これはあなたの問題です

REPLACE(' + @ColumnName + ',' + @SearchStr2 + ',' + ''''')'

これは物事を置き換えています... 2 つの単一引用符が続きます。

参照: REPLACE (Transact-SQL)

于 2012-09-11T17:28:02.903 に答える