|
| 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
| |
|
|