Welcome to Sign in | Help

Re: un alt Script...o alta provocare

  •  02-15-2007, 10:23 PM

    Re: un alt Script...o alta provocare

    Mai întâi, avem următoarele probleme:

    1. Care e legătura dintre tabelele QASLogInfoProba şi QASUserProba ? Cred că e vorba de QASUserName, care ar fi trebuit să fie un foreign key spre UserIdentification, dar nu poate fi, deoarece tipurile de date sunt diferite.

    2. Cum se reprezintă logon şi logoff în tabela QASLogInfo, pentru că văd o singură coloană de tip datetime. Cumva QASItemType reprezintă tipul evenimentului ?

    3. Ideea de a avea tabele separate "CycleTimes_L01", "CycleTimes_L02", etc este în contradicţie cu regulile de normalizare a bazelor de date. Ar fi trebuit să existe o singură tabelă CycleTimes, iar L01, L02, etc să fie nişte valori într-o coloană a acestei tabele.

    Dacă am fi avut nişte tabele mai normale, query-ul putea să fie de genul următor:

    SELECT UserName, ComponentName,
    SUM(DurationInSeconds) as TotalDurationInSeconds
    FROM Users u INNER JOIN Sessions s ON u.UserID=s.UserID
    INNER JOIN CycleTimes t ON s.Station=t.Station
    INNER JOIN Components c ON c.ComponentID=t.ComponentID
    GROUP BY UserName, ComponentName

    În condiţiile în care trebuie să lucrezi cu tabele nenormalizate, cu foreign key-uri care lipsesc şi cu informaţii care sunt ascunse ca ultimele 3 caractere dintr-o coloană, eu personal nu vreau să dau o soluţie completă pentru aşa ceva. În principiu, poţi folosi cursoare, dynamic sql şi tabele temporare ca să rezolvi orice, dar soluţia corectă porneşte de la o structură sănătoasă a bazei de date şi am impresia că asta lipseşte în primul rând. Cu structura existentă, codul ar putea fi de genul următor:

    DECLARE Utilizatori CURSOR FOR
    SELECT UserIdentification FROM QASUserProba

    WHILE 1=1 BEGIN

      FETCH NEXT FROM Utilizator INTO @Utilizator
      IF @@FETCH_STATUS<>0 BREAK

      DECLARE Statii CURSOR FOR
      SELECT QASStation FROM QASLogInfoProba WHERE QASUserName=@Utilizator

      WHILE 1=1 BEGIN

         FETCH NEXT FROM Statii INTO @Statie
         IF @@FETCH_STATUS<>0 BREAK

         DECLARE @SQL nvarchar(4000)
         SET @SQL='
           INSERT INTO #Temp
           SELECT '''+@Utilizator+''', '''+@Statie+''', NumeComponenta, SUM(timeInWsSeconds)
           FROM CycleTimes_'+@Statie+' WHERE QASStation='''+@Statie+''' AND ???
           GROUP BY NumeComponenta
         '

         EXEC (@SQL)

      END
    END

    Evident, codul de mai sus e incomplet, vulnerabil la SQL Injection, neperformant şi într-un cuvânt, groaznic. Cel mai bine e să corectezi structura bazei de date, chiar dacă poţi să-l completezi ca să fie acceptabil.

    Răzvan

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems