Sql server 从字符串中删除双下划线
我正在使用一系列替换来删除基于内部规则集的特殊字符 我首先对存储过程中的一些字符进行多次替换,然后对UDF进行交叉连接,沿着包含要删除(未替换)的其他字符的正则表达式传递剥离值 如果这样做,将正确处理以下值: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中时,当我以这种方式运行代码时,会返回
'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,希望它能显示可能发现错误的地方。非常感谢。有没有可能有人能帮我弄清楚我为什么会有这个问题?非常感谢。