Sql server 从字符串中删除双下划线

Sql server 从字符串中删除双下划线,sql-server,string,tsql,replace,Sql Server,String,Tsql,Replace,我正在使用一系列替换来删除基于内部规则集的特殊字符 我首先对存储过程中的一些字符进行多次替换,然后对UDF进行交叉连接,沿着包含要删除(未替换)的其他字符的正则表达式传递剥离值 如果这样做,将正确处理以下值: 'O Sole Mio - Bass Clef Instrument 应用多重替换并调用udf后,我最终得到: o_sole_mio_bass_clef_instrument 我遇到的问题是,当我从存储过程中获取所有REPLACE并将它们放入UDF中时,当我以这种方式运行代码时,会返回

我正在使用一系列替换来删除基于内部规则集的特殊字符

我首先对存储过程中的一些字符进行多次替换,然后对UDF进行交叉连接,沿着包含要删除(未替换)的其他字符的正则表达式传递剥离值

如果这样做,将正确处理以下值:

'O Sole Mio - Bass Clef Instrument
应用多重替换并调用udf后,我最终得到:

o_sole_mio_bass_clef_instrument
我遇到的问题是,当我从存储过程中获取所有REPLACE并将它们放入UDF中时,当我以这种方式运行代码时,会返回相同的值,如下所示:

o_sole_mio__bass_clef_instrument

这项工作: 存储过程

BEGIN

    SET NOCOUNT ON;
    DECLARE @workTable TABLE
    (
        [wtID]      INT IDENTITY PRIMARY KEY CLUSTERED
    ,   [sku]       VARCHAR(15)
    ,   [wtString]  VARCHAR(800)
    );

    INSERT  @workTable
    SELECT              
        1
    ,   REPLACE(
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE(
                                REPLACE(
                                    REPLACE(
                                        REPLACE(
                                            LOWER('''O Sole Mio - Bass Clef Instrument')
                                        , CHAR(9), '')
                                    , '_', ' ')
                                , ' ', '_')
                            , '_-_', '_')
                        , '-', '_')
                    , '_&_', '_')
                , '=', '_')
            , '_/_', '_')
        , '/', '_')     

    SELECT      
        wt.sku
    ,   [wt].[wtString] AS 'ThisValueStillHasSomeCharactersTobeRemoved'
    ,   [MyResult] AS 'ThisValueIsTheExpectedResult'        
    FROM        
        @workTable [wt]     
    CROSS APPLY 
        [dbo].[RemoveValuesFromString]([wt].[wtString], '%[]~@#$%&*(),.,!¡^¿?:´''"/`+{},...,%')
    ORDER BY        
        [wt].[wtString]; 

END 
BEGIN
    SET NOCOUNT ON;
    DECLARE @workTable TABLE
    (
        [wtID]      INT IDENTITY PRIMARY KEY CLUSTERED
    ,   [sku]       VARCHAR(15)
    ,   [wtString]  VARCHAR(800)
    );

    INSERT  @workTable
    SELECT              
        1
    ,   '''O Sole Mio - Bass Clef Instrument'

    SELECT      
        wt.sku
    ,   [wt].[wtString] AS 'ThisValueStillHasSomeCharactersTobeRemoved'
    ,   [MyResult] AS 'ThisValueIsTheExpectedResult'        
    FROM        
        @workTable [wt]     
    CROSS APPLY 
        [dbo].[RemoveValuesFromString]([wt].[wtString], '%[]~@#$%&*(),.,!¡^¿?:´''"/`+{},...,%')
    ORDER BY        
        [wt].[wtString];  

END
UDF:

ALTER FUNCTION [dbo].[RemoveValuesFromString]
(
    @SearchVal NVARCHAR(MAX)
,   @CharsToRemove NVARCHAR(MAX)
)
RETURNS TABLE

AS 

RETURN

WITH        [MyValues]      

AS 
( 
    SELECT
        SUBSTRING(@SearchVal, [N], 1) AS [MyChar]
    ,   [t].[N]
    FROM
        [cteTally] [t]
    WHERE
        [N] <= LEN(@SearchVal)
        AND CHARINDEX(SUBSTRING(@SearchVal, [N], 1), @CharsToRemove) = 0
)       

SELECT DISTINCT
    [MyResult] = STUFF((SELECT 
                            CAST([mv2].[MyChar] AS VARCHAR(MAX)) COLLATE SQL_Latin1_General_CP1251_CS_AS
                        FROM
                            [MyValues] [mv2]
                        ORDER BY
                            [mv2].[N]
                    FOR
                        XML PATH(''),   TYPE).[value]('.', 'NVARCHAR(MAX)'), 1, 0, '')
FROM
    [MyValues] [mv];

这不起作用: 存储过程

BEGIN

    SET NOCOUNT ON;
    DECLARE @workTable TABLE
    (
        [wtID]      INT IDENTITY PRIMARY KEY CLUSTERED
    ,   [sku]       VARCHAR(15)
    ,   [wtString]  VARCHAR(800)
    );

    INSERT  @workTable
    SELECT              
        1
    ,   REPLACE(
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE(
                                REPLACE(
                                    REPLACE(
                                        REPLACE(
                                            LOWER('''O Sole Mio - Bass Clef Instrument')
                                        , CHAR(9), '')
                                    , '_', ' ')
                                , ' ', '_')
                            , '_-_', '_')
                        , '-', '_')
                    , '_&_', '_')
                , '=', '_')
            , '_/_', '_')
        , '/', '_')     

    SELECT      
        wt.sku
    ,   [wt].[wtString] AS 'ThisValueStillHasSomeCharactersTobeRemoved'
    ,   [MyResult] AS 'ThisValueIsTheExpectedResult'        
    FROM        
        @workTable [wt]     
    CROSS APPLY 
        [dbo].[RemoveValuesFromString]([wt].[wtString], '%[]~@#$%&*(),.,!¡^¿?:´''"/`+{},...,%')
    ORDER BY        
        [wt].[wtString]; 

END 
BEGIN
    SET NOCOUNT ON;
    DECLARE @workTable TABLE
    (
        [wtID]      INT IDENTITY PRIMARY KEY CLUSTERED
    ,   [sku]       VARCHAR(15)
    ,   [wtString]  VARCHAR(800)
    );

    INSERT  @workTable
    SELECT              
        1
    ,   '''O Sole Mio - Bass Clef Instrument'

    SELECT      
        wt.sku
    ,   [wt].[wtString] AS 'ThisValueStillHasSomeCharactersTobeRemoved'
    ,   [MyResult] AS 'ThisValueIsTheExpectedResult'        
    FROM        
        @workTable [wt]     
    CROSS APPLY 
        [dbo].[RemoveValuesFromString]([wt].[wtString], '%[]~@#$%&*(),.,!¡^¿?:´''"/`+{},...,%')
    ORDER BY        
        [wt].[wtString];  

END
UDF

ALTER FUNCTION [dbo].[RemoveValuesFromString]
(
    @SearchVal NVARCHAR(MAX)
,   @CharsToRemove NVARCHAR(MAX)
)
RETURNS TABLE       
AS      
RETURN      
WITH [MyValues]             
AS 
(   SELECT
        SUBSTRING(@SearchVal, [N], 1) AS [MyChar]
    ,   [t].[N]
    FROM
        [cteTally] [t]
    WHERE
        [N] <= LEN(@SearchVal)
        AND CHARINDEX(SUBSTRING(@SearchVal, [N], 1), @CharsToRemove) = 0
)
SELECT DISTINCT
    [MyResult] = STUFF((SELECT                                                                              
                            REPLACE(
                                REPLACE(
                                    REPLACE(
                                        REPLACE(
                                            REPLACE(
                                                REPLACE(
                                                    REPLACE(
                                                        REPLACE(
                                                            REPLACE(
                                                                LOWER(CAST([mv2].[MyChar] AS VARCHAR(MAX)) COLLATE SQL_Latin1_General_CP1251_CS_AS)
                                                            , CHAR(9), '')
                                                        , '_', ' ')
                                                    , ' ', '_')
                                                , '_-_', '_')
                                            , '-', '_')
                                        , '_&_', '_')
                                    , '=', '_')
                                , '_/_', '_')
                            , '/', '_')                                                                                 
                        FROM
                            [MyValues] [mv2]
                        ORDER BY
                            [mv2].[N]
                    FOR
                        XML PATH(''),   TYPE).[value]('.', 'NVARCHAR(MAX)'), 1, 0, '')
FROM
    [MyValues] [mv];
我希望我问的问题是正确的,我想我只是忽略了一些非常简单的事情。我真的非常感谢你的帮助


非常感谢。

我按原样运行了您的代码,代码运行正常。它给了我想要的输出,它也对我有用。最好记住,函数总是首先从内部进行计算。我刚刚更新完我的问题,我加入了更多的t-sql,希望它能显示可能发现错误的地方。非常感谢。有没有可能有人能帮我弄清楚我为什么会有这个问题?谢谢我按原样运行了你的代码,它工作正常。它给了我想要的输出,它也对我有用。最好记住,函数总是首先从内部进行计算。我刚刚更新完我的问题,我加入了更多的t-sql,希望它能显示可能发现错误的地方。非常感谢。有没有可能有人能帮我弄清楚我为什么会有这个问题?非常感谢。