2017-03-02 4 views
0

J'ai la table avec l'identification et les droits de deux colonnes. La colonne des droits conservera 250 caractères fixes sous la forme 0,1, comme '010111100000000 .... 250 fois'. Maintenant je dois diviser la chaîne de colonne de droits et obtenir les résultats dans la table de temp qui aura l'ID de structure, droits (0 ou 1), position (1 à 250). Supposons que j'ai initialement 5 lignes alors dans la table temporaire j'obtiendrai 5 * 250 = 1250 lignes.cte dans le serveur de SQL avec la table de temp et la chaîne de fente

J'ai divisé la chaîne unique et le curseur utilisé mais maintenant je veux éviter le curseur. Comment je peux y arriver.

declare @temp table(Chars int not null, RowID int not null) 

    --Split the rights string into 250 char rows with RowID as each position 
    ;with cte as 
    (
     select substring(@rights, 1, 1) as Chars, 
       stuff(@rights, 1, 1, '') as rights, 
       1 as RowID 
     union all 
     select substring(rights, 1, 1) as Chars, 
       stuff(rights, 1, 1, '') as rights, 
       RowID + 1 as RowID 
     from cte 
     where len(rights) > 0 

    ) 

    --Get the values in a temporary table except 0 
    insert into @temp select Chars, RowID from cte option (MAXRECURSION 300); 

Répondre

1

Que pensez-vous de cela?

L'idée est la suivante: Obtenir une liste de 250 numéros de course et utiliser SUBSTRING pour lire un caractère de chaque position:

DECLARE @tbl TABLE (ID INT IDENTITY,Rights VARCHAR(250)); 
INSERT INTO @tbl VALUES 
('1011101110000101010111000...'), ('0100010111100010101...'); 

WITH Nr250 AS 
(SELECT TOP 250 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nr FROM master.dbo.spt_values) 

SELECT t.ID 
     ,t.Rights 
     ,Nr AS Position 
     ,SUBSTRING(t.Rights,Nr,1) AS PosDigit 
--INTO #SomeTempTable 
FROM Nr250 
CROSS JOIN @tbl AS t 

Si vous voulez écrire ceci dans une table temporaire, il suffit de retirer le -- avant INTO

+0

Merci beaucoup cela a fonctionné pour moi – Anurag