Curseur T SQL

bluefred Messages postés 2 Date d'inscription mercredi 18 janvier 2006 Statut Membre Dernière intervention 11 mai 2009 - 2 mai 2009 à 23:04
bluefred Messages postés 2 Date d'inscription mercredi 18 janvier 2006 Statut Membre Dernière intervention 11 mai 2009 - 11 mai 2009 à 21:23
Salut,
je suis débutant en SQL, je vais compter le nombre de caractère unique sur chaque ligne.
dans une table j'ai une colonne qui est comme:
id colonne
1 AB
2 AABBAC
3 ABCADDFA
.
.
merci bcp

2 réponses

aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
4 mai 2009 à 12:48
Bonjour

il y a plusieurs facon de faire ca, mais je pense que la solution la plus simple, en passant par une procedure stockée, est de :

1/ créer une table temporaire avec une seule colonne
2/ faire une boucle : inserer chaque lettre une par une dans la table temporaire
3/ faire un count(distinct * ) sur la table temporaire = resultat voulu
0
bluefred Messages postés 2 Date d'inscription mercredi 18 janvier 2006 Statut Membre Dernière intervention 11 mai 2009
11 mai 2009 à 21:23
Bonjour, merci bcp pour ta réponse.

Désolé, mais je vois pas comment ça va aboutir au résultat, ce que je veux par exemple (+ précisément, cette fois) est d'éliminer quelque bloque de caractère, les 5 chiffres après les deux 1er caractères alphanumérique, et après, extraire les éléments uniques par ligne.


RegStr


----------------------------------------------------
AA00123-AA00124-AF00525
----------------------------------------------------
AA00823-A900624-TF00525-TF00124-AA00123
----------------------------------------------------
AA00123-AA00724-AF00525-AF12345-AA00978
----------------------------------------------------
AB00123-AB00124-AF00525-AB00987-AF56432
----------------------------------------------------
...
J'ai fais une recherche sur le net et j'ai trouver que Oracle géré très bien cette question a l'aide de Regular Expression (REGEXP_REPLACE) mais je connais pas comment le faire avec MS SQL.
Avec MS SQL (Version 7.0), j'ai créé un curseur ça marche mais ça se bloque quelque part, ma table contient a peu prés 1 million d'observation et peut évoluer d'avantage.

C'est quoi le plus rapide et sure, les curseurs ou la procédure stock
ée


-----------------------------------------------------------

--Create & fill out the table
-----------------------------------------------------------


create table #Test (RegStr varchar(250))
go
insert into #Test (RegStr) values ('AA00123-AA00124-AF00525')
insert into #Test (RegStr) values ('AA00823-A900624-TF00525-TF00124-AA00123')
insert into #Test (RegStr) values ('AA00123-AA00724-AF00525-AF12345-AA00978')
insert into #Test (RegStr) values ('AB00123-AB00124-AF00525-AB00987-AF56432')

alter table #Test
add AllRegStr varchar(250)
go
alter table #Test
add UniqueStr varchar(250)
go

-----------------------------------------------------------
--Get RegStr

-----------------------------------------------------------

Declare @Num int, @String varchar(250), @RegStr varchar(250), @j int
Declare Get_RegStr cursor for
select RegStr from #Test
open Get_RegStr
fetch next from Get_RegStr into @String
set @RegStr = @String
WHILE @@FETCH_STATUS = 0
begin 
  set @Num = (len(replace(@RegStr,'-',''))/7)
  set @j = 0
    WHILE @j < @Num
      begin
       set @RegStr = STUFF(@RegStr, 3+2*@j, 6, '')
       set @j=@j+1
      end           
    update #Test
    set AllRegStr = @RegStr
    where #Test.RegStr = @string
FETCH NEXT FROM Get_RegStr into @String
set @RegStr = @String
end
close Get_RegStr
-----------------------------------------------------------
--Get UniqueStr
-----------------------------------------------------------
Declare @Str varchar(250), @i int, @Count int, @result varchar(250), @RegStr varchar(250)
Declare Get_Unique cursor for
select AllRegStr from #Test
open Get_Unique
fetch next from Get_Unique into @Str
set @RegStr = @Str
WHILE @@FETCH_STATUS = 0
begin
  set @i = 1
  set @count = (len(@RegStr))
    while (@i < @Count)
    begin
    if (@result IS NULL)
      begin
      set @result = ''
      end
   set @result = @result + SUBSTRING(@RegStr,1,2)
   set @RegStr = REPLACE(@RegStr,SUBSTRING(@RegStr,1,2),'')
   set @i = @i + 2
   end
    update #Test
    set UniqueStr = @result
    where #Test.AllRegStr = @Str
FETCH NEXT FROM Get_Unique into @Str
set @RegStr = @Str
set @result = ''
end
close Get_Unique
deallocate Get_Unique
0
Rejoignez-nous