如何反转 sql 服务器中某一列中的字符串?

how to reverse the strings in one of the column in sql server?

我希望将名称列中的所有条目反转并存储在 SQL SERVER 2008 的另一列中。 我不想使用字符串反转功能。 我想用循环来做。

name         reversename
----------   ----------
john         nhoj
kevin        nivek
paul         luap

table结构- 承包商(合同号、姓名、电子邮件、电话号码)

我只想要整个名称列的倒序。

我已经试过了

DECLARE @revString VARCHAR(55)=''
DECLARE @string2 VARCHAR(55)= (SELECT NAME FROM CONTRACTOR)

DECLARE @ln INT=LEN(@string2)

WHILE @ln > 0
BEGIN
    SET @revString = @revString + SUBSTRING(@string2, @ln, 1)
    SET @ln= @ln - 1
END
SELECT @string2, @revString,@ln

也找到了使用循环的解决方案

DECLARE @NAME VARCHAR(MAX)
DECLARE @REVERSE TABLE(
Name    VARCHAR(MAX),
ReverseName  VARCHAR(MAX))
DECLARE NAME_CURSOR CURSOR FOR 
SELECT DISTINCT NAME FROM CONTRACTOR
OPEN NAME_CURSOR 
FETCH NEXT FROM NAME_CURSOR
INTO
@NAME

WHILE @@FETCH_STATUS = 0   
BEGIN

    DECLARE @revString VARCHAR(55)=''
    DECLARE @string2 VARCHAR(55)= @NAME
    DECLARE @ln INT=LEN(@string2)

    WHILE @ln > 0
    BEGIN
            SET @revString = @revString + SUBSTRING(@string2, @ln, 1)
            SET @ln= @ln - 1
    END
    INSERT INTO @REVERSE VALUES (@string2, @revString)
    FETCH NEXT FROM NAME_CURSOR INTO @NAME
END
SELECT * FROM @REVERSE
CLOSE NAME_CURSOR
DEALLOCATE NAME_CURSOR

好的,显然是家庭作业。除了语法和技术,这里的 要点 是您应该 真正地 尽可能避免循环...想想数据集。

考虑以下因素

1) 子查询 B1 将使用临时计数 table 为字符串中的每个字符创建一条记录。 tally/numbers table 也可以。 internal/temporary 结果如下所示:

2) Cross Apply B中的XML Path部分会按照N

的降序合并记录

例子

    Declare @YourTable Table ([name] varchar(50))
    Insert Into @YourTable Values
     ('john')
    ,('kevin')
    ,('paul')

Select A.Name 
      ,ReverseName = B.NewString
 From @YourTable A
 Cross Apply (
                Select NewString = Stuff((Select '' +C 
                  From (
                        Select N,C = substring(A.Name,N,1)  
                         From (Select Top (len(A.Name)) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values ) A1
                       ) B1
                  Order By N Desc
                  FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)')
                  ,1,0,'')
             ) B

最终结果

创建这个函数

CREATE FUNCTION [dbo].[revString] (@input VARCHAR(250))
RETURNS VARCHAR(250)
AS BEGIN
DECLARE @strCount int;
DECLARE @revStr varchar(250) ='';
declare @cnt int ;
set @strCount = LEN(@input);
set @cnt= @strCount;

While @cnt>0
    begin
        set @revStr= @revStr +  substring(@input,@cnt,1);
        set @cnt =@cnt-1;
    end 
RETURN @revStr
END

select dbo.revString('ASSDE') -- 结果 (EDSSA)

这是使用一种循环,通过加入计数 table 并以相反的顺序连接值。

DECLARE @test table(name varchar(10))
INSERT @test values('John'),('Tom Jones')

;WITH N(N)AS 
(
  SELECT 
    1
  FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)
),
tally(N)AS
(
  SELECT ROW_NUMBER()OVER(ORDER BY N.N)
  FROM N,N a,N b,N c,N d,N e,N f
)
SELECT
  *
FROM
  @test t
CROSS APPLY
(
  SELECT
    ( 
      SELECT z
      FROM 
        (SELECT substring(name, N, 1) z, N
         FROM tally
         WHERE n < =LEN(name)) t1 
      ORDER BY N DESC
      FOR xml path(''), type 
  ).value('.', 'varchar(max)') z
) y