如何在sql server的一列中反转字符串?

时间:2017-06-12 12:21:14

标签: sql sql-server database reverse

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

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

表结构 - 承包商(contractno,名称,电子邮件,phoneno)

我只想按相反顺序输入整个名称列。

我已经尝试过了

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

3 个答案:

答案 0 :(得分:2)

好的,显然是家庭作业。除了语法和技术之外,这里的外卖是你应该真的尽可能避免循环......想想数据集。

考虑以下

1)子查询B1将使用ad-hoc计数表为字符串中的每个字符创建一条记录。一个计数/数字表也可以做到这一点。内部/临时结果如下所示:

enter image description here

2)Cross Apply B中的XML Path部分将按DES的DESCEENDING顺序合并记录

示例

    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

最终结果

enter image description here

答案 1 :(得分:1)

这是通过连接计数表并以相反的顺序连接值来使用一种循环。

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

答案 2 :(得分:-1)

创建此功能

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

选择dbo.revString('ASSDE') - 结果(EDSSA)