我希望名称列中的所有条目都反转并存储在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
答案 0 :(得分:2)
好的,显然是家庭作业。除了语法和技术之外,这里的外卖是你应该真的尽可能避免循环......想想数据集。
考虑以下
1)子查询B1将使用ad-hoc计数表为字符串中的每个字符创建一条记录。一个计数/数字表也可以做到这一点。内部/临时结果如下所示:
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
最终结果
答案 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)