Sql server 如何使用TSQL将非单词字符替换为破折号?

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

如何替换字符~!@$%^&*.+}{][在带有-using TSQL的nvarchar或varchar字段中?

您可以使用函数。如果在某些情况下它不起作用,请给出示例

可能是您正在搜索的:

-- 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('')
                    ), '&#X20;', ' ')
    --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