Query T-SQL per generare tutte le combinazioni tra i simboli definiti
Esempio di script T-SQL per generare tutte le combinazioni possibili (variabile @digit) di determinati caratteri passati (variabile @simbol).
Per funzionare utilizza una variabile di tipo TABLE e dei cross join tra se stessa.
Per eseguirla è sufficiente impostare le variabilie @simbol e @digit. Ci sono già degli esempi commentati con i numeri binari, ottali, esadecimali e i simboli della schedina:
Il codice della query:
esempio di output con @digit=5 e @simbol='12X'
Per funzionare utilizza una variabile di tipo TABLE e dei cross join tra se stessa.
Per eseguirla è sufficiente impostare le variabilie @simbol e @digit. Ci sono già degli esempi commentati con i numeri binari, ottali, esadecimali e i simboli della schedina:
Il codice della query:
SQL
/*
* script sql per generare, in forma di stringa,
* tutte le combinazioni possibili di siboli (@simbol)
* con un numero specifico di cifre (@digit)
* 05-11-2006 http://www.sgart.it
*/
DECLARE @simbol varchar(20)
DECLARE @digit int-- non esagerare con le cifre
-- binario
SET @digit = 5
SET @simbol = '01'
SELECT POWER(len(@simbol), @digit) [combinazioni]
/*
-- binario true / false
SET @digit = 4
SET @simbol = 'FT'
*/
/*
-- schedina
SET @digit = 4
SET @simbol = '12X'
*/
/*
-- ottale
SET @digit = 4
SET @simbol = '01234567'
*/
/*
-- esadecimale
SET @digit = 4
SET @simbol = '0123456789ABCDEF'
*/
SET NOCOUNT ON
/* preparo la tabella temporanea */
DECLARE @query varchar(8000)
SET @query = 'DECLARE @T TABLE ([d] varchar(10));'
/* inserisco i siboli */
DECLARE @i int
SET @i = 1
WHILE @i <= len(@simbol)
BEGIN
SET @query = @query + 'INSERT INTO @T VALUES(''' + substring(@simbol, @i, 1) + ''');'
SET @i = @i + 1
END
--select @query -- solo per debug
--SET @query = @query + 'SELECT * FROM @T;' -- solo per debug
/* creo le cros join in funzione delle cifre (digit) */
DECLARE @select varchar(4000)
DECLARE @from varchar(4000)
DECLARE @strI varchar(2)
SET @select = ''
SET @from = ''
SET @i = 1
WHILE @i <= @digit
BEGIN
SET @strI = cast(@i as varchar(2))
IF @i = @digit
BEGIN
SET @select = @select + 'A' + @strI + '.[d]'
SET @from = @from + '@T A' + @strI
END
ELSE
BEGIN
SET @select = @select + 'A' + @strI + '.[d]+'
SET @from = @from + '@T A' + @strI + ' cross join '
END
SET @i = @i + 1
END
--SELECT @select -- solo per debug
--SELECT @from -- solo per debug
/* costriusco la query finale */
SET @query = @query + 'SELECT (' + @select + ') AS [digit] FROM ' + @from + ' ORDER BY 1;'
/* eseguo la query */
exec(@query)
combinazioni
------------
243
digit
--------------------------------------------------
11111
11112
1111X
11121
11122
1112X
111X1
...