/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Hvordan sætter man NULL ind?
Fra : oz


Dato : 04-12-01 12:23

Hej NG

Jeg har et nyheds modul hvor folk kan taste diverse oplysninger ind, ikke
alle felter kræver værdier, så tabellen accepterer <NULL> værdier, mit
problem opstår dog når folk så ikke udfylder de felter der ikke SKAL
udfyldes, så kommer der ikke til at stå <NULL> i DB, men der kommer bare et
blankt felt og det er jo ikke lig med <NULL> eller ??
Hvordan får jeg skrevet <NULL> ind hvor der ingen værdier er?? Gør jeg det
via min indtastnings formular/asp fra nettet eller kan jeg gøre det via min
SP_insert_nyhed??

Jeg arbejder med MSSQL, ASP og indsætter og opdaterer nyhederne via SP og
parametre, jeg har forsøgt at sætte en default value (= NULL) til de
parametre der ikke kræver en værdi, men det giver stadig et blankt felt i DB
og ikke et <NULL>, hvordan kan jeg få skrevet <NULL> ind der hvor der ingen
data er ???

Håber der er nogen der kan hjælpe mig.....

Ps. er der nogen der har et godt eksempel på hvordan man anvender
sp_executesql, jeg har forsøgt at læse BOL og forsøgt med små lette
eksempler men jeg kan bare ikke få det til at du, jeg syntes nemlig jeg
løber ind i mange spørgsmål, som jeg ikke kan finde svar på i BOL, så sidder
der en med et eksempel så ville jeg blive meget taknemlig...

På forhånd tak

Oz



 
 
Stig Johansen (05-12-2001)
Kommentar
Fra : Stig Johansen


Dato : 05-12-01 05:04

oz wrote:

> Hej NG
>
> Jeg har et nyheds modul hvor folk kan taste diverse oplysninger ind, ikke
> alle felter kræver værdier, så tabellen accepterer <NULL> værdier, mit
> problem opstår dog når folk så ikke udfylder de felter der ikke SKAL
> udfyldes, så kommer der ikke til at stå <NULL> i DB, men der kommer bare
> et blankt felt og det er jo ikke lig med <NULL> eller ??
> Hvordan får jeg skrevet <NULL> ind hvor der ingen værdier er?? Gør jeg det
> via min indtastnings formular/asp fra nettet eller kan jeg gøre det via
> min SP_insert_nyhed??
>

Du skal bare lade være med at indsætte noget i det felt, der ikke er
udfyldt.

Hvis en tabel,t1 består af felterne a,b,c eksempel:
insert into t1 (a,c) values('a','c')
så er b NULL.

--
Med venlig hilsen / Best regards
Stig Johansen
linux@w3data.dk

oz (05-12-2001)
Kommentar
Fra : oz


Dato : 05-12-01 18:02


"Stig Johansen" <linux@w3data.dk> skrev

> Du skal bare lade være med at indsætte noget i det felt, der ikke er
> udfyldt.
>
> Hvis en tabel,t1 består af felterne a,b,c eksempel:
> insert into t1 (a,c) values('a','c')
> så er b NULL.

Hej Stig,

Det ville også virke ved jeg, hvis jeg ville bruge den metode, men nu bruger
jeg SP, som forventer parametre så jeg kan ikke lige undlade dem da jeg så
generere en SQL fejl.
Løsningen må ligge i at fortælle min SP at hvis feltet er tomt så skal den
indsætte <NULL>, men det er bare lige hvordan man gør det, jeg har forsøgt
at sætte default value til NULL, men det virker heller ikke.

Øv, har du evt. andre forslag?

Oz



Kristian Damm Jensen (07-12-2001)
Kommentar
Fra : Kristian Damm Jensen


Dato : 07-12-01 10:54

oz wrote:
>
> "Stig Johansen" <linux@w3data.dk> skrev
>
> > Du skal bare lade være med at indsætte noget i det felt, der ikke er
> > udfyldt.
> >
> > Hvis en tabel,t1 består af felterne a,b,c eksempel:
> > insert into t1 (a,c) values('a','c')
> > så er b NULL.
>
> Hej Stig,
>
> Det ville også virke ved jeg, hvis jeg ville bruge den metode, men nu bruger
> jeg SP, som forventer parametre så jeg kan ikke lige undlade dem da jeg så
> generere en SQL fejl.

Jo.

Men det kræver at du fortæller ved oprettelsen af proceduren at
parameteren kan udelades:

create procedure test
@var int = NULL
as
select * from tabel
where @var is NULL or felt = @var

> Løsningen må ligge i at fortælle min SP at hvis feltet er tomt så skal den
> indsætte <NULL>, men det er bare lige hvordan man gør det, jeg har forsøgt
> at sætte default value til NULL, men det virker heller ikke.
>
> Øv, har du evt. andre forslag?
>
> Oz

--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts do.



Kristian Damm Jensen (05-12-2001)
Kommentar
Fra : Kristian Damm Jensen


Dato : 05-12-01 08:10



oz wrote:
>
> Hej NG
>
> Jeg har et nyheds modul hvor folk kan taste diverse oplysninger ind, ikke
> alle felter kræver værdier, så tabellen accepterer <NULL> værdier, mit
> problem opstår dog når folk så ikke udfylder de felter der ikke SKAL
> udfyldes, så kommer der ikke til at stå <NULL> i DB, men der kommer bare et
> blankt felt og det er jo ikke lig med <NULL> eller ??

NULL er ikke en værdi, men en tilstand. Forskellige systemer viser NULL
på forskellig vis, når man laver forespørgsler, der returnerer NULL.
Sandsynligheden er, at det er dette du er ude for, for hvis du ikke
lægger noget ind, og feltet er defineret som nullable, så vil feltet
være NULL.

Spørgsmålet er derfor, hvorfor mener du, at der kun er et blankt felt og
ikke NULL? Har du lavet en forespørgsel

select * from tabel

? I så fald kan du ikke sige noget med sikkerhed.

Hvis du i stedet laver søgningen

select * from tabel where felt is NULL

så er du på mere sikker grund.

<snip>

--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts do.


oz (05-12-2001)
Kommentar
Fra : oz


Dato : 05-12-01 18:08


"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev:

> NULL er ikke en værdi, men en tilstand. Forskellige systemer viser NULL
> på forskellig vis, når man laver forespørgsler, der returnerer NULL.
> Sandsynligheden er, at det er dette du er ude for, for hvis du ikke
> lægger noget ind, og feltet er defineret som nullable, så vil feltet
> være NULL.

Ja og nej, MSSQL server skriver ikke noget i feltet hvis jeg overfører et
tomt felt via mine parametre og det er ikke lig med <NULL> jeg har forsøgt
med "IS NULL" og de felter der er blanke i DB kommer nemlig ikke frem da de
ikke er lig med NULL men bare tomme....

Jeg har forsøgt at lave det således i min SP at defult value er = NULL, det
skulle så gøre at hvis ikke andet angives fra parametren så skulle den sætte
det til NULL men det gør den bare ikke, det forbliver et tomt felt.....

Jeg syntes nu det er lidt mærkeligt, kan du komme på andre forslag?

Med venlig hilsen

Oz




Kim Emax - ayianapa.~ (05-12-2001)
Kommentar
Fra : Kim Emax - ayianapa.~


Dato : 05-12-01 22:32


"oz" <gonzo@strike-team.com> skrev

> Ja og nej, MSSQL server skriver ikke noget i feltet hvis jeg overfører et
> tomt felt via mine parametre og det er ikke lig med <NULL> jeg har forsøgt
> med "IS NULL" og de felter der er blanke i DB kommer nemlig ikke frem da
de
> ikke er lig med NULL men bare tomme....
>
> Jeg har forsøgt at lave det således i min SP at defult value er = NULL,
det
> skulle så gøre at hvis ikke andet angives fra parametren så skulle den
sætte
> det til NULL men det gør den bare ikke, det forbliver et tomt felt.....
>
> Jeg syntes nu det er lidt mærkeligt, kan du komme på andre forslag?

laver du ikke en "insert into tabel(a, b, c) VALUES('$a', '$b', '$c')";?

del den op:

$SQL = "INSERT INTO tabel(";

if($a) $SQL .= "a'";
if($b) $SQL .= "b";
if($c) $SQL .= "c";

$SQL .= ") VALUES(";

if($a) $SQL .= "'$a'";
if($b) $SQL .= "'$b'";
if($c) $SQL .= "'$c'";

$SQL .= ")";

er b tom får du denne:

INSERT INTO tabel(a,c) VALUES('$a','$c')

og dit felt b er stadig NULL

--
Take Care
Kim Emax
http://www.emax.dk
http://www.ayianapa.dk
Køb din vin online på http://www.gmvin.dk,
Danmarks måske mest avancerede VinWebShop



oz (05-12-2001)
Kommentar
Fra : oz


Dato : 05-12-01 22:49


"Kim Emax - ayianapa.dk" <newsgroup@sletdette-ayianapa.dk> skrev:

> laver du ikke en "insert into tabel(a, b, c) VALUES('$a', '$b', '$c')";?
>
> del den op:
>
> $SQL = "INSERT INTO tabel(";
>
> if($a) $SQL .= "a'";
> if($b) $SQL .= "b";
> if($c) $SQL .= "c";
>
> $SQL .= ") VALUES(";
>
> if($a) $SQL .= "'$a'";
> if($b) $SQL .= "'$b'";
> if($c) $SQL .= "'$c'";
>
> $SQL .= ")";
>
> er b tom får du denne:
>
> INSERT INTO tabel(a,c) VALUES('$a','$c')
>
> og dit felt b er stadig NULL

Jo det gør jeg da, men jeg får mine værdier via parametre fra en formular,
men det ser meget spændende ud så dit forslag vil jeg teste....

Tak =)

oz



oz (05-12-2001)
Kommentar
Fra : oz


Dato : 05-12-01 23:11


"Kim Emax - ayianapa.dk" <newsgroup@sletdette-ayianapa.dk> skrev:

Ok nu har jeg prøvet, men jeg syntes stadig ikke jeg kan få det til at
du....
Min SP ser således ud:

CREATE PROCEDURE sp_News_INSERT

@Cust_ID int,
@Heading varchar(50),
@Txt varchar(450),
@Link varchar(100) = NULL,
@Email varchar(50) = NULL

AS

INSERT INTO News
(Cust_ID, Heading, Txt, Link, Email)

VALUES
(@Cust_ID, @Heading, @Txt, @Link, @Email)

@Link og @Email er frivillige felter, som de ikke behøver at udfylde og
derfor gerne skulle være NULL, ovenstående virker fint, dog insættes NULL
ikke i Link og Email hvis de ikke angives, det bliver bare et blankt felt i
DB.... Dit eksempel kan jeg ikke få til at virke, se mit udkast nedenfor,
måske du kan se hvad jeg gør forkert.....

CREATE PROCEDURE sp_News_INSERT

@Cust_ID int,
@Heading varchar(50),
@Txt varchar(450),
@Link varchar(100) = NULL,
@Email varchar(50) = NULL

AS

$SQL = "INSERT INTO News(";

if($Cust_ID) $SQL .= "Cust_ID'";
if($Heading) $SQL .= "Heading";
if($Txt) $SQL .= "Txt";
if($Link) $SQL .= "Link";
if($Email) $SQL .= "Email";

$SQL .= ")

VALUES(";

if($Cust_ID) $SQL .= "'$Cust_ID";
if($Heading) $SQL .= "'$Heading";
if($Txt) $SQL .= "'$Txt";
if($Link) $SQL .= "'$Link";
if($Email) $SQL .= "'$Email";

$SQL .= ")";

Den brokker sig over Det første $tegn???? Kan du hjælpe med at omsrive det
til noget der kan bruges????

På forhånd tak

Oz



Kim Emax - ayianapa.~ (06-12-2001)
Kommentar
Fra : Kim Emax - ayianapa.~


Dato : 06-12-01 00:26


"oz" <gonzo@strike-team.com> skrev

> $SQL .= ")";
>
> Den brokker sig over Det første $tegn???? Kan du hjælpe med at omsrive det
> til noget der kan bruges????

kender ikke lige det sprog du kører der, men prøv evt. at ændre
betingelserne til dette

if($a != "") {
$SQL .= "$a";
}

bemærk også at der _skal_ være komma mellem de felter du vil indsætte, det
fik jeg ikke med i mit eksempel. I PHP som jeg roder med, ville jeg smide
felterne, der skal udfyldes i et array og joine det bagefter:

if($a) $SQLarray[]= "a'";
if($b) $SQLarray[] = "b";
if($c) $SQLarray[]= "c";

$SQLready = join(",", $SQLarray); # = a,b,c

--
Take Care
Kim Emax
http://www.emax.dk
http://www.ayianapa.dk
Køb din vin online på http://www.gmvin.dk,
Danmarks måske mest avancerede VinWebShop





Kim Emax - ayianapa.~ (06-12-2001)
Kommentar
Fra : Kim Emax - ayianapa.~


Dato : 06-12-01 00:31


"oz" <gonzo@strike-team.com> skrev

> CREATE PROCEDURE sp_News_INSERT
>
> @Cust_ID int,
> @Heading varchar(50),
> @Txt varchar(450),
> @Link varchar(100) = NULL,
> @Email varchar(50) = NULL

Jeg tror altså ikke du kan gøre som du gør der... så har du smækket en værdi
på @link

> AS
>
> INSERT INTO News
> (Cust_ID, Heading, Txt, Link, Email)
>
> VALUES
> (@Cust_ID, @Heading, @Txt, @Link, @Email)

hvis @link er tomt, skal du _undlade_ at angive at du vil indsætte noget i
det felt:

INSERT INTO News
(Cust_ID, Heading, Txt, Email)
VALUES
(@Cust_ID, @Heading, @Txt, @Email)

det vil tildele "værdien" NULL til link feltet

--
Take Care
Kim Emax
http://www.emax.dk
http://www.ayianapa.dk
Køb din vin online på http://www.gmvin.dk,
Danmarks måske mest avancerede VinWebShop




Kristian Damm Jensen (07-12-2001)
Kommentar
Fra : Kristian Damm Jensen


Dato : 07-12-01 11:01

"Kim Emax - ayianapa.dk" wrote:
>
> "oz" <gonzo@strike-team.com> skrev
>
> > CREATE PROCEDURE sp_News_INSERT
> >
> > @Cust_ID int,
> > @Heading varchar(50),
> > @Txt varchar(450),
> > @Link varchar(100) = NULL,
> > @Email varchar(50) = NULL
>
> Jeg tror altså ikke du kan gøre som du gør der... så har du smækket en værdi
> på @link

Nej. Man har fortalt, at @Link kan udelades i hvilket tilfælde
default-"værdien" skal være NULL. Det ville virke fint, hvis det ikke
lige var fordi @Link er varchar.

> > AS
> >
> > INSERT INTO News
> > (Cust_ID, Heading, Txt, Link, Email)
> >
> > VALUES
> > (@Cust_ID, @Heading, @Txt, @Link, @Email)
>
> hvis @link er tomt, skal du _undlade_ at angive at du vil indsætte noget i
> det felt:
>
> INSERT INTO News
> (Cust_ID, Heading, Txt, Email)
> VALUES
> (@Cust_ID, @Heading, @Txt, @Email)
>
> det vil tildele "værdien" NULL til link feltet

INSERT INTO News
(Cust_ID, Heading, Txt, Link, Email)
VALUES
(@Cust_ID, @Heading, @Txt, NULL, @Email)

vil også lagre NULL i Link-feltet. - Hvilket er eksakt eksvivalent til

select @Link = NULL
INSERT INTO News
(Cust_ID, Heading, Txt, Link, Email)
VALUES
(@Cust_ID, @Heading, @Txt, @Link, @Email)


--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts do.


Kristian Damm Jensen (07-12-2001)
Kommentar
Fra : Kristian Damm Jensen


Dato : 07-12-01 10:58

oz wrote:
>
> "Kim Emax - ayianapa.dk" <newsgroup@sletdette-ayianapa.dk> skrev:
>
> Ok nu har jeg prøvet, men jeg syntes stadig ikke jeg kan få det til at
> du....
> Min SP ser således ud:
>
> CREATE PROCEDURE sp_News_INSERT
>
> @Cust_ID int,
> @Heading varchar(50),
> @Txt varchar(450),
> @Link varchar(100) = NULL,
> @Email varchar(50) = NULL
>
> AS
>
> INSERT INTO News
> (Cust_ID, Heading, Txt, Link, Email)
>
> VALUES
> (@Cust_ID, @Heading, @Txt, @Link, @Email)
>
> @Link og @Email er frivillige felter, som de ikke behøver at udfylde og
> derfor gerne skulle være NULL, ovenstående virker fint, dog insættes NULL
> ikke i Link og Email hvis de ikke angives, det bliver bare et blankt felt i
> DB.

AH! SQLServer er ikke i stand til at skelne mellem en tom streng og en
ikke-eksisterende (null) streng, når datatypen er varchar. Det skyldes,
at man benytter det interne felt, hvori længden lagres til at markere
NULL. Her er der ikke noget at gøre.

> ... Dit eksempel kan jeg ikke få til at virke, se mit udkast nedenfor,
> måske du kan se hvad jeg gør forkert.....
>
> CREATE PROCEDURE sp_News_INSERT
>
> @Cust_ID int,
> @Heading varchar(50),
> @Txt varchar(450),
> @Link varchar(100) = NULL,
> @Email varchar(50) = NULL
>
> AS
>
> $SQL = "INSERT INTO News(";
>
> if($Cust_ID) $SQL .= "Cust_ID'";
> if($Heading) $SQL .= "Heading";
> if($Txt) $SQL .= "Txt";
> if($Link) $SQL .= "Link";
> if($Email) $SQL .= "Email";
>
> $SQL .= ")
>
> VALUES(";
>
> if($Cust_ID) $SQL .= "'$Cust_ID";
> if($Heading) $SQL .= "'$Heading";
> if($Txt) $SQL .= "'$Txt";
> if($Link) $SQL .= "'$Link";
> if($Email) $SQL .= "'$Email";
>
> $SQL .= ")";
>
> Den brokker sig over Det første $tegn???? Kan du hjælpe med at omsrive det
> til noget der kan bruges????
>
> På forhånd tak
>
> Oz

--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts do.



oz (07-12-2001)
Kommentar
Fra : oz


Dato : 07-12-01 13:15


"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev

> AH! SQLServer er ikke i stand til at skelne mellem en tom streng og en
> ikke-eksisterende (null) streng, når datatypen er varchar. Det skyldes,
> at man benytter det interne felt, hvori længden lagres til at markere
> NULL. Her er der ikke noget at gøre.

Det er da træls, forstår jeg dig rigtig? Man kan altså ikke lagre NULL i et
felt med datatype varchar!!!! Kan man det i andre datatyper????
Det mærkelige er bare at jeg har opgraderet fra access til SQLServer og alle
mine gamle nyheder, hvor link eller email er tomme står der NULL, så det
virker åbenbart i Access men ikke i MSSQL, der må da være en løsning, og det
er sikkert nemt hvis man lige viste hvordan...

Men du skal have 1000 tak for din hjælp, det afklarer min problematik, så nu
må jeg prøve noget andet istedet, jeg ville jo bare have sat pris på at der
stod NULL hvis der ikke var en værdi, men det må jeg åbenbart leve med
så....


Oz




Kristian Damm Jensen (07-12-2001)
Kommentar
Fra : Kristian Damm Jensen


Dato : 07-12-01 10:56

oz wrote:
>
> "Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev:
>
> > NULL er ikke en værdi, men en tilstand. Forskellige systemer viser NULL
> > på forskellig vis, når man laver forespørgsler, der returnerer NULL.
> > Sandsynligheden er, at det er dette du er ude for, for hvis du ikke
> > lægger noget ind, og feltet er defineret som nullable, så vil feltet
> > være NULL.
>
> Ja og nej, MSSQL server skriver ikke noget i feltet hvis jeg overfører et
> tomt felt via mine parametre og det er ikke lig med <NULL> jeg har forsøgt
> med "IS NULL" og de felter der er blanke i DB kommer nemlig ikke frem da de
> ikke er lig med NULL men bare tomme....
>
> Jeg har forsøgt at lave det således i min SP at defult value er = NULL, det
> skulle så gøre at hvis ikke andet angives fra parametren så skulle den sætte
> det til NULL men det gør den bare ikke, det forbliver et tomt felt.....
>
> Jeg syntes nu det er lidt mærkeligt, kan du komme på andre forslag?

Du kan starte med at poste nogle korte eksempler, der viser, hvad der
går galt. Jeg er lidt usikker på, hvad det egentlig er du gør, og hvad
du får ud af det.


--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts do.



Peter Lykkegaard (05-12-2001)
Kommentar
Fra : Peter Lykkegaard


Dato : 05-12-01 21:10


"oz" <gonzo@strike-team.com> wrote in message
news:9uibml$r1c$1@sunsite.dk...

> Ps. er der nogen der har et godt eksempel på hvordan man anvender
> sp_executesql, jeg har forsøgt at læse BOL og forsøgt med små lette
> eksempler men jeg kan bare ikke få det til at du, jeg syntes nemlig jeg
> løber ind i mange spørgsmål, som jeg ikke kan finde svar på i BOL, så
sidder
> der en med et eksempel så ville jeg blive meget taknemlig...
>
Eksemplerne i BOL er nok ikke for de mere uøvede
Prøv at eksperimentere lidt med den i Query Analyzeren

Bygger man sine queries dynamisk, så skal du oprette en string variabel
først og derefter bruge sp_executesql

Det følgende er meget simpelt - start med nogle simple eksempler og byy så
på efterhånden

----------------------------------------------------------------------------
--------
Declare @WhereClause NVarChar(500)
Declare @SQLStatement NVarChar(1000)

Set @WhereClause = N'WHERE MyField = ''Test'''
Set @SQLStatement = N'Select * From MyTable ' + @WhereClause

Exec sp_ExecuteSQL @SQLStatement
----------------------------------------------------------------------------
--------
(testet i Query Analyzer)

Vil du parmdefinition så er det noget lign dette
Vær opmærksom på at @ParmDef skal inde alle parameter definitioner
----------------------------------------------------------------------------
--------
Declare @ParmDef NVarChar(500)
Declare @SQLStatement NVarChar(1000)

Set @SQLStatement = N'Select * From MyTable Where MyField = @Field'
Set @ParmDef = N'@Field VarChar(20)'

Exec sp_ExecuteSQL @SQLStatement, @ParmDef, 'Test'
----------------------------------------------------------------------------
--------
(testet i Query Analyzer)

mvh/Peter Lykkegaard



oz (05-12-2001)
Kommentar
Fra : oz


Dato : 05-12-01 21:32


"Peter Lykkegaard" <polonline@hotmail.com> skrev:

> Eksemplerne i BOL er nok ikke for de mere uøvede
> Prøv at eksperimentere lidt med den i Query Analyzeren
>
> Bygger man sine queries dynamisk, så skal du oprette en string variabel
> først og derefter bruge sp_executesql
>
> Det følgende er meget simpelt - start med nogle simple eksempler og byy så
> på efterhånden

<snip>

Tusind tak for dine råd, jeg vil straks gå igang med at teste... Dine
eksempler ser ud til at virke.

Tak igen

oz



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste