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:

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)
esempio di output con @digit=5 e @simbol='12X'
combinazioni 
------------ 
243

digit                                              
-------------------------------------------------- 
11111
11112
1111X
11121
11122
1112X
111X1
...
Tags:
Database75 SQL90 SQL Server100 T-SQL66
Potrebbe interessarti anche: