简体   繁体   English

在CTE SQL的select语句中更新局部变量

[英]Update local variable in select statement of CTE sql

Currently, I am having CTE statement which generates a random number for each character in some predefined alphanumeric characters. 当前,我正在使用CTE语句,该语句为一些预定义的字母数字字符中的每个字符生成一个随机数。

I am using a user-defined random function. 我正在使用用户定义的随机函数。 But the random function gives me repeated result rows. 但是随机函数给了我重复的结果行。 I don't want any character to be repeated so I am trying to remove the character which is already used in the select statement of CTE, so that same character can't be used as the replacement in further upcoming characters. 我不希望重复任何字符,因此我尝试删除CTE的select语句中已经使用的字符,以使相同的字符不能用作后续其他字符的替换。 But I am not able to update set of characters in CTE Select statement 但是我无法更新CTE Select语句中的字符集

DECLARE @characters VARCHAR(100) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
DECLARE @upperAlphabet VARCHAR(30) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';


DECLARE @lowerAlphabet VARCHAR(30) = 'abcdefghijklmnopqrstuvwxyz';


DECLARE @numbers VARCHAR(10) = '9876543210';
DECLARE @numbersCount int;

Declare @ReplacedCharacter varchar(2);
DECLARE @selectedUpperChar VARCHAR(1) ;

WITH CTE AS (
 SELECT
  1 as CharacterPosition,
  SUBSTRING(@alphas,1,1) as [Character]
  , (SELECT   RIGHT( LEFT(@upperAlphabet,dbo.RandomNumber(1,26) ),1)) AS replaceCharacter

  UNION ALL
   SELECT
  CharacterPosition + 1,
  SUBSTRING(@alphas,CharacterPosition + 1,1)
  , CASE 
   WHEN CharacterPosition < 26 
   THEN (SELECT RIGHT( LEFT(@upperAlphabet,dbo.RandomNumber(1,26)),1))
   WHEN CharacterPosition >= 26 AND CharacterPosition < 52
   THEN (SELECT RIGHT( LEFT(@lowerAlphabet,dbo.RandomNumber(1,26) ),1))
   ELSE (SELECT RIGHT( LEFT(@numbers,dbo.RandomNumber(1,10) ),1))

  END

 FROM
  CTE
 WHERE CharacterPosition < LEN(@alphas)
)

SELECT CharacterPosition, [Character], replaceCharacter
FROM CTE

You can get the expected result by simply using a while and removing the replacedCharacter from the list of the remaining/available ones. 您只需使用while然后从剩余/可用列表中删除replacedCharacter即可获得预期的结果。

Try the following code: 尝试以下代码:

DECLARE @alphas VARCHAR(100) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
DECLARE @upperAlphabet VARCHAR(30) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
DECLARE @lowerAlphabet VARCHAR(30) = 'abcdefghijklmnopqrstuvwxyz';
DECLARE @numbers VARCHAR(10) = '9876543210';

Declare @ReplacedCharacter varchar(2);

declare @result table (CharacterPosition int, [Character] varchar(1), replaceCharacter varchar(1));
declare @position int = 1;
declare @characher varchar(1);
declare @remaining varchar(100);

while len(@alphas) > 0
 begin
    set @characher = SUBSTRING(@alphas,1,1)

    if @position <= 26
        begin
            set @replacedCharacter = RIGHT(LEFT(@upperAlphabet, CEILING(dbo.RandomNumber(1, len(@upperAlphabet) + 1))),1);
            set @upperAlphabet = replace(@upperAlphabet, @replacedCharacter, '');
        end
    else
        begin 
            if @position > 26 AND @position <= 52
                begin
                    set @replacedCharacter = RIGHT(LEFT(@lowerAlphabet, CEILING(dbo.RandomNumber(1,len(@lowerAlphabet) + 1)) ),1);
                    set @lowerAlphabet = replace(@lowerAlphabet, @replacedCharacter, '');
                end
            else
                begin
                    set @replacedCharacter = RIGHT(LEFT(@numbers, CEILING(dbo.RandomNumber(1,len(@numbers) + 1))),1);
                    set @numbers = replace(@numbers, @replacedCharacter, '');
                end
        end

    insert into @result (CharacterPosition, [Character], replaceCharacter)
    values (@position, @characher, @ReplacedCharacter)

    set @alphas = right(@alphas, len(@alphas) - 1)
    set @position = @position + 1
 end

 select * from @result;

Result: 结果:

CharacterPosition   Character   replaceCharacter
1   A   J
2   B   X
3   C   O
4   D   S
5   E   C
6   F   Z
7   G   V
8   H   N
9   I   P
10  J   K
11  K   G
12  L   T
13  M   W
14  N   F
15  O   I
16  P   Q
17  Q   U
18  R   B
19  S   H
20  T   E
21  U   L
22  V   M
23  W   D
24  X   A
25  Y   Y
26  Z   R
27  a   s
28  b   n
29  c   y
30  d   m
31  e   b
32  f   w
33  g   u
34  h   l
35  i   c
36  j   o
37  k   h
38  l   z
39  m   t
40  n   i
41  o   k
42  p   p
43  q   j
44  r   r
45  s   e
46  t   d
47  u   g
48  v   q
49  w   f
50  x   x
51  y   v
52  z   a
53  0   4
54  1   8
55  2   9
56  3   0
57  4   6
58  5   2
59  6   3
60  7   5
61  8   1
62  9   7

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM