Sql server 如何使用TSQL将非单词字符替换为破折号?
如何替换字符~!@$%^&*.+}{][在带有-using TSQL的nvarchar或varchar字段中?您可以使用函数。如果在某些情况下它不起作用,请给出示例 可能是您正在搜索的:Sql server 如何使用TSQL将非单词字符替换为破折号?,sql-server,tsql,Sql Server,Tsql,如何替换字符~!@$%^&*.+}{][在带有-using TSQL的nvarchar或varchar字段中?您可以使用函数。如果在某些情况下它不起作用,请给出示例 可能是您正在搜索的: -- Author: Christian d'Heureuse, www.source-code.biz create function dbo.RemoveSpecialChars (@s varchar(256)) returns varchar(256) with schemabinding beg
-- Author: Christian d'Heureuse, www.source-code.biz
create function dbo.RemoveSpecialChars (@s varchar(256)) returns varchar(256)
with schemabinding
begin
if @s is null
return null
declare @s2 varchar(256)
set @s2 = ''
declare @l int
set @l = len(@s)
declare @p int
set @p = 1
while @p <= @l begin
declare @c int
set @c = ascii(substring(@s, @p, 1))
if @c between 48 and 57 or @c between 65 and 90 or @c between 97 and 122
set @s2 = @s2 + char(@c)
set @p = @p + 1
end
if len(@s2) = 0
return null
return @s2
end
它删除除0-9、a-z和a-z之外的所有字符。此函数使用ASCII字符代码确定必须删除的字符。您可以为该字符创建用户定义函数,如下所示
CREATE FUNCTION udf_ReplaceSpecialChar
(
@inputString VARCHAR(1000)
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @outputString VARCHAR(1000),
@LENGTH INT,
@index INT,
@char CHAR(1)
SELECT @LENGTH = LEN(@inputString),
@index = 1
WHILE(@index <= @LENGTH)
BEGIN
SET @char = SUBSTRING(@inputString, @index, 1)
IF((ASCII(@char) NOT BETWEEN 65 AND 90) AND (ASCII(@char) NOT BETWEEN 97 AND 122) AND (ASCII(@char) NOT BETWEEN 48 AND 57))
BEGIN
SELECT @inputString = REPLACE(@inputString, @char, '-')
END
SET @index = @index + 1
END
SET @outputString = @inputString
RETURN @outputString
END
SELECT dbo.udf_ReplaceSpecialChar('This()*& is%%@Sample**.>String')
如果希望将此方法用作函数,则:
创建带有一个字段主键1000行的理货表,从1开始执行步骤1
使用下面的代码创建函数
桌上理货对于分割钉、清洁绳等非常有用,目前这是
最好的方法是使用fetch、xml等
可能这段代码就是你正在搜索的,亲爱的,我也搜索了很多解决方案……这个例子删除了所有的特殊字符……但我想替换,而不是删除所有的特殊字符。我的文本在表列中。你所需要的是-如果@c在48和57之间,或者@c在65和90之间,或者@c在97和122之间,请重写这一行,以包括您需要删除的字符此外,您可以删除此条件的最后一部分,此函数将完全执行您需要的操作~!@$%^&*.+}{][…除了数字和字符a-z之外,其他都是。如果你想保留a-z,就让它保持原样吧。感谢Mohit,这正是我所需要的。这一个也正在工作…这是返回:这是另一个变体如何用破折号替换空格,使其看起来像:这是另一个变体,它刚刚将最后一行“&X20;”更改为“&X20;”,“-”这比第一个更好…我希望我以前有过这个:@MaxPayne,我将发布另一个变体,我认为它比我之前的文章更好,它目前用作SQL server中的函数
SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('This()*& is%%@Sample**.>String', ' ', '-'), '*', '-'), '@', '-'), '&', '-'), '(', '-'), ')', '-'), '.', '-'), '>', '-'), '%', '-')
--another one variant
----------------------------------------------------------------------------------------
--better to keep such table in server, very usefull table, especially with indexes
DECLARE @Tally TABLE ( N INT )
DECLARE @i AS INT = 1
WHILE @i != 1000
BEGIN
INSERT INTO @Tally
( N )
VALUES ( @i )
SET @i = @i + 1
END
----------------------------------------------------------------------------------------
DECLARE @String AS VARCHAR(1000) = 'This()*& is%%@ **.>another one //&^&*$variant'
----------------------------------------------------------------------------------------
--using @tally - split, using like - remove not required, 'for xml ...' - combine into string
SELECT REPLACE(( SELECT LEFT(SUBSTRING(@String, n, 1000), 1)
FROM @Tally AS T
WHERE SUBSTRING(@String, n, 1000) != ''
AND LEFT(SUBSTRING(@String, n, 1000), 1) LIKE '[A-Za-z0-9 ]'
FOR
XML PATH('')
), ' ', ' ')
--another one variant
------------------------------------------------------------------------------------
--better to keep such table in server, very usefull table, especially with indexes
DECLARE @Tally TABLE ( N INT )
DECLARE @i AS INT = 1
WHILE @i != 1000
BEGIN
INSERT INTO @Tally
( N )
VALUES ( @i )
SET @i = @i + 1
END
------------------------------------------------------------------------------------
DECLARE @String VARCHAR(500) ,
@B VARCHAR(500) = ''
SET @String = 'This()*& is%%@ **.>another one //&^&*$variant'
SELECT @B = @B + SUBSTRING(@String, t.N, 1)
FROM @Tally t
WHERE t.N <= DATALENGTH(@String)
AND PATINDEX('[A-Za-z0-9 ]', SUBSTRING(@String, t.N, 1)) > 0
SELECT @B
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
CREATE FUNCTION [dbo].[StringClean](
@A VARCHAR(500))
RETURNS VARCHAR(500)
AS
BEGIN
DECLARE @B VARCHAR(500)
SET @B = ''
SELECT @B = @B + SUBSTRING(@A, t.N, 1)
FROM dbo.Tally t
WHERE t.N <= DATALENGTH(@A)
AND PATINDEX('[A-Za-z0-9 ]', SUBSTRING(@A, t.N, 1)) > 0
RETURN @B
END
-------------------------------------------------------------------------------
SELECT dbo.StringClean('This()*& is%%@ **.>another one //&^&*$variant')
-------------------------------------------------------------------------------
DECLARE @Tally TABLE ( N INT )
DECLARE @i AS INT = 1
WHILE @i != 1000
BEGIN
INSERT INTO @Tally (N) VALUES (@i)
SET @i = @i + 1
END
--------------------------------------------------------------
DECLARE @String VARCHAR(500)
DECLARE @B VARCHAR(500) = ''
DECLARE @ReplacedChars VARCHAR(50) = '~!@#$%^&*()_+}{][<>/.'
SET @String = 'This()*& is%%@ **.>another one //&^&*$variant'
SELECT @B = @B + CASE WHEN CHARINDEX(SUBSTRING(@String, t.N, 1), @ReplacedChars) > 0 THEN '-'
ELSE SUBSTRING(@String, t.N, 1) END
FROM @Tally t
WHERE t.N <= DATALENGTH(@String)
SELECT @B