First you need to be able to break a four-digit number into separate digits. I suggest using a table variable and the modulus operator. Assuming we have an integer input named @input
, we can break it into its digits using this:
DECLARE @Digits Table(Number int)
INSERT INTO @Digits(Number)
VALUES (@input % 10),
(@input / 10 % 10),
(@input / 100 % 10),
(@input / 1000 % 10)
Now we have a table with four rows, one row per digit.
To create a combination of four digits, we need to include the table four times, meaning we need three joins. The joins have to be set up so no digit is duplicated. Thus our FROM
and JOIN
clauses will look like this:
FROM @Digits D1
JOIN @Digits D2 ON D2.Number <> D1.Number
JOIN @Digits D3 ON D3.Number <> D1.Number
AND D3.Number <> D2.Number
JOIN @Digits D4 ON D4.Number <> D1.Number
AND D4.Number <> D2.Number
AND D4.Number <> D3.Number
Now to take the values and make a new, four-digit integer:
SELECT Number = D1.Number * 1000
+ D2.Number * 100
+ D3.Number * 10
+ D4.Number
The complete solution:
CREATE PROC Combine(@input AS int)
AS
BEGIN
DECLARE @Digits Table(Number int)
;
INSERT INTO @Digits(Number)
VALUES (@input % 10),
(@input / 10 % 10),
(@input / 100 % 10),
(@input / 1000 % 10)
;
SELECT Number = D1.Number * 1000
+ D2.Number * 100
+ D3.Number * 10
+ D4.Number
FROM @Digits D1
JOIN @Digits D2 ON D2.Number <> D1.Number
JOIN @Digits D3 ON D3.Number <> D1.Number
AND D3.Number <> D2.Number
JOIN @Digits D4 ON D4.Number <> D1.Number
AND D4.Number <> D2.Number
AND D4.Number <> D3.Number
ORDER BY Number
;
END
Usage:
EXEC Combine 1234
Resultset:
Number
------
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3421
4123
4132
4213
4231
4312
4321
24 row(s)
Click here to run the above code on RexTester