Avatar billede rsd Nybegynder
27. oktober 2004 - 09:41 Der er 12 kommentarer og
1 løsning

Bytter rundt på kolonner

Jeg har et lidt underligt problem i en af mine store SQL databaser. Når jeg har rettet/tilføjet et felt i en tabel, bytter den rundt på kolonnerne i mine views, således at den f.eks. viser ID i navnefeltet og navnet i ID feltet.

Hvis jeg efterfølgende åbner mit view i desingvisning og gemmer det uden at rette i det så kører det korrekt igen.

?????

Claus
Avatar billede trer Nybegynder
28. oktober 2004 - 13:49 #1
Bruger du wildcards i din select?
Avatar billede rsd Nybegynder
29. oktober 2004 - 06:21 #2
Ja det gør jeg, er det et problem??

Claus
Avatar billede trer Nybegynder
29. oktober 2004 - 12:51 #3
Med wildcards fortæller du netop at du er totalt lige glad med kolonneorden etc - og i viewet fortæller du så i headeren at uanset kolonne-orden skal første kolonne hedde det, anden det etc etc...

Skift fra at anvende * til specifike kolonnenavne - så er dit problem løst.
Avatar billede rsd Nybegynder
29. oktober 2004 - 13:34 #4
Hvis det bare var så simpelt så havde jeg ikke noget problem. Det der sker er at hvis kolonneoverskriften f.eks. er KundeID, så består indholdet af kolonnen i stedet af kundenavn, dvs. at kolonnenavn/overskrift ikke passer med indholdet. Den gør det faktisk hver gang jeg ændrer i den underliggende tabel.

Claus
Avatar billede ldanielsen Nybegynder
31. oktober 2004 - 14:34 #5
Alle views skal refreshes hvis du laver om på tabellerne. Åbn dem i design, og klik på gem.

Jeg har et script der kan gøre det, vent lige lidt ...
Avatar billede ldanielsen Nybegynder
31. oktober 2004 - 14:38 #6
DECLARE @Name varchar(255)

DECLARE curViews CURSOR 
FOR
SELECT Name FROM sysobjects WHERE xtype = 'V'

OPEN curViews

FETCH NEXT FROM curViews
INTO @Name

WHILE @@FETCH_STATUS = 0
BEGIN 
EXEC sp_refreshview @Name
print @Name
FETCH NEXT FROM curViews 
INTO @Name
END

CLOSE curViews
DEALLOCATE curViews


Start evt med en USE databasenavn, og kør den i QA
Avatar billede rsd Nybegynder
01. november 2004 - 08:45 #7
Det ser ud til at virke.
Tak
Avatar billede ldanielsen Nybegynder
01. november 2004 - 08:47 #8
Er det mig?
Avatar billede rsd Nybegynder
01. november 2004 - 17:16 #9
Ja undskyld Ida det er dig.

Claus
Avatar billede ldanielsen Nybegynder
01. november 2004 - 22:28 #10
Tak for det.

Forklaringen er den, at SQL Serveren, når den får en forespørgsel, starter med at undersøge hvilken måde den hurtigst kan udføre den. Det handler især om indexer, og om hvordan resultaterne ønskes sorteret. Det bliver til en "execution plan". Fordelen ved views er at der allerede er en execution plan. Den laves når view'et gemmes, og da den altså er klar, kan er view returnere data hurtigere en en "rå" forespørgsel.

Men hvis forholdene ændres, hvis der laves om på kolonnerne eller på indexerne, så skal der laves en ny execution plan. Ellers får man fejl, uforudsete resultater eller man får ikke den performance man ville forvente.

Så kør ovenstående script hver gang du ændrer noget, og som en del af fx en ugentlig vedligeholdelse. Det er ikke specielt tungt at køre.
Avatar billede trer Nybegynder
02. november 2004 - 10:34 #11
Ida har naturligvis ret - jeg var faktisk ikke opmærksom på, at SQL Server ikke automatisk genererede en ny query plan.

Men problemet opstår stadig kun når du anvender wildchars i din select - det opstår ikke når du benytter navngivne kolonner.
Avatar billede ldanielsen Nybegynder
02. november 2004 - 11:49 #12
Tak for det trer.

Jeg leder stadig efter en grund til at benytte wildcards, det skulle være i et system hvor tabeller ændres dynamisk, eller hvad? Ellers må det være dovenskab, og det er en rigtig dårlig grund. Hvis du navngiver kolonnerne sparer du også serveren for arbejdet med at generere listen selv. Og har du virkelig brug for alle kolonner?

I øvrigt - navnet er Lars Danielsen, det er et lille l, ikke et stort I c",)
Avatar billede trer Nybegynder
02. november 2004 - 12:17 #13
Vups beklager Lars, det havde jeg ikke bemærket...

Eneste sted jeg ved der er fordel ved at anvende en * fremfor en kolonne er i COUNT().

Anvendelsen af * sikrer at SQL Server kan vælge en indekseret kolonne hvor angivelsen af en kolonne tvinger til SQL Server at tælle kolonnen op uanset om der er et indeks eller ej. 

Du har naturligvis også ret mht dovenskab - specielt ved ad hoc sql i query analyzer - men, synes jeg, ikke mht wildchars i dynamisk ændrede systemer. Bruger man wildchars vil fejlen måske først blive opdaget "højt oppe" i applikationen - og værre, måske først efter et langt stykke tid. Så foretrækker jeg at første forsøg på en tabel-adgang giver en "stop" fejl...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester