[SQL SERVER] varchar waarde bepalen

Pagina: 1
Acties:
  • 172 views sinds 30-01-2008
  • Reageer

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
Ik heb een stored procedure die een aantal varchars als invoerwaarde krijgt. Als deze varchars een waarde hebben moet er een bepaald stuk code uitgevoerd worden, als ze leeg zijn moet er niets gebeuren. Op de een of andere manier loopt sql server gewoon over de check heen, en gaat vrolijk de queries uitvoeren en foutmeldingen geven.
Wat heb ik al geprobeerd?
SQL:
1
IF (LEN(@string) > 0)
SQL:
1
IF (LEN(LTRIM(@string)) > 0)
SQL:
1
IF (@string IS NOT NULL)
SQL:
1
IF (LEN(@string) <> 0)
Mag allemaal niet baten...
Het vreemde is dat als ik in de Query analyser bijvoorbeeld
SQL:
1
2
3
4
5
6
7
DECLARE @x varchar(20)
SET @x = 'blabla'
IF LEN(@x) > 0
    BEGIN
        print 'ja groter dan 0!!!'
    END
GO
doe, dat dit werkt als een trein. Als ik soortgelijke code in m'n SP stop dan werkt het weer niet...

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Waarom check je gewoon niet zo:
code:
1
IF @avar = ''


of
code:
1
IF @avar IS NULL

:?

https://fgheysels.github.io/


Verwijderd

Laat je SP een zien (voor namelijk de kop)

code:
1
2
3
4
5
6
7
CREATE PROCEDURE string_check
  @sString  VARCHAR(20)
AS 
BEGIN
....
END
Go

[ Voor 55% gewijzigd door Verwijderd op 21-11-2003 11:52 . Reden: Voorbeeld toegevoegd ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
IF NOT (@string is null)

Of:
code:
1
ISNUMERIC (@string)

Of:
code:
1
If Len(LTrim(RTrim(@string))>0

en zie whoami :P

[ Voor 102% gewijzigd door RobIII op 21-11-2003 11:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
ISNUMERIC heb ik niet veel aan, omdat het geen integer waarde is die in de varchar moet zitten.

SQL:
1
IF @avar = ''
Werkt niet...
SQL:
1
IF NOT (@string is null)
Werkt ook niet...
SQL:
1
IF NOT @avar IS NULL
nope
SQL:
1
If Len(LTrim(RTrim(@string))=0
RTRIM is niet nodig, LEN rekent trailing spaces niet mee
Ik kom er net achter dat ik vanuit m'n ASP.NET pagina een lege strin naar de stored procedure stuur, als ik die NULL maak dan crasht hij omdat de variable dan helemaal niet naar de SP gestuurd wordt.

De kop van de SP ziet er zo uit:
code:
1
2
3
4
5
6
7
8
CREATE PROCEDURE crm_updateProductDetails
(
@productID int,
@name varchar(50),
@version varchar(20),
@standardModules varchar(100),
@optionalModules varchar(100)
)
(oplettende mensen komen wel bekende elementen tegen uit vorige topics van mij ;) )

[ Voor 104% gewijzigd door sig69 op 21-11-2003 12:02 ]

Roomba E5 te koop


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
sig69 schreef op 21 november 2003 @ 11:52:
RTRIM is niet nodig, LEN rekent trailing spaces niet mee
Ik had BIJNA geroepen: Echt wel! Maar ben toch eens effe de help ingedoken. VERREK!
LEN
Returns the number of characters, rather than the number of bytes, of the given string expression, excluding trailing blanks.
Da's nieuw voor mij... Weer iets geleerd :Y)

Ik zie alleen niet waarom je code niet werkt. Enkele van bovenstaande voorbeelden zouden toch écht moeten werken hoor. Laat je hele IF-Block eens zien?

Oh...Probeer eens:
code:
1
If Len(@avar) is null


Waarom? Omdat:

code:
1
2
3
4
5
6
7
8
9
10
DECLARE @strTest1 as varchar(100)
DECLARE @strTest2 as varchar(100)
DECLARE @strTest3 as varchar(100)

Set @strTest1 = 'test'
Set @strTest2 = ''

Select Len(@strTest1)
Select Len(@strTest2)
Select Len(@strTest3)


De waardes, respectievelijk 4, 0, NULL geeft...

[ Voor 28% gewijzigd door RobIII op 21-11-2003 12:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
code:
1
If Len(@avar) is null
Werkt ook niet, damn.

Stored Procedure:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- if we have a string with optional module id's
IF NOT Len(@optionalModules) is null --WERKT NIET!!!!
    BEGIN
        --insert the product's optionalmodules
        SET @count = 0
        SET @vorige = 0
        SET @volgende = 0
        
        WHILE (@count < LEN(@optionalModules) )
            BEGIN
                IF SUBSTRING(@optionalModules, @count, 1) = '|'
                    BEGIN
                        -- Get the index of the next "|"
                        SET @volgende = CHARINDEX('|', @optionalModules, @vorige + 1)
        
                        -- Get the substring until the next "|"
                        SET @moduleID =  SUBSTRING(@optionalModules, @vorige + 1,  @volgende - 1 - @vorige)
                        
                        --insert the module
                        INSERT INTO
                            xProductModuleOptions(productID, moduleID, standard)
                        VALUES
                            (@productID, @moduleID, 0)
        
                        -- SET the vorige tot the volgende value
                        SET @vorige = @volgende
                    END
                SET @count = @count + 1
            END
    END

Code uit m'n asp pagina:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string strOptionalModules = "";
for (int i=0; i<optionalModuleDataList.Items.Count; i++)
{
    CheckBox txtChk  = (System.Web.UI.WebControls.CheckBox)optionalModuleDataList.Items[i].FindControl("optionalModule");
    if(txtChk.Checked == true)
    {
        if (strOptionalModules.Length == 0)
        {
            strOptionalModules = optionalModuleDataList.DataKeys[i].ToString();
        }
        else
        {
            strOptionalModules += "|" + optionalModuleDataList.DataKeys[i].ToString();
        }               
    }
}
updateProductCommand.Parameters.Add(new SqlParameter("@optionalModules", SqlDbType.VarChar, 100)).Value = strOptionalModules;

Ik begrijp er echt niks van..

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Je moet ook niet checken of de lengte van die variabele NULL is.
Check of de lengte van de variabele 0 is, of check of de inhoud leeg of null is.

https://fgheysels.github.io/


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Je moet ff een NULL achter de definitie van je optionalModules zetten, dan kun je wel op NULL testen:

code:
1
2
3
4
5
6
7
8
CREATE PROCEDURE crm_updateProductDetails
(
@productID int,
@name varchar(50),
@version varchar(20),
@standardModules varchar(100),
@optionalModules varchar(100) = NULL
)

[ Voor 5% gewijzigd door Robbemans op 21-11-2003 12:53 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
whoami schreef op 21 november 2003 @ 12:31:
Je moet ook niet checken of de lengte van die variabele NULL is.
Check of de lengte van de variabele 0 is, of check of de inhoud leeg of null is.
Dat heb ik dus allemaal al geprobeerd:
-lengte(waarde) = 0
-lengte(waarde) > 0
-lengte(waarde) > NULL
-waarde = ''
-waarde = NULL

Edit:
nou breekt m'n klomp...
voeg ik de code
C#:
1
2
3
4
if (strOptionalModules.Length == 0)
{
    strOptionalModules = "none";
}
toe, en wil dat afvangen in m'n SP met
code:
1
IF NOT (@optionalModules = 'none')
werkt dat ook gewoon niet...
Volgens mij zit er ergens iets goed fout.

Edit: verkeerde code gecopy-paste, sorry

[ Voor 40% gewijzigd door sig69 op 21-11-2003 12:52 ]

Roomba E5 te koop


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
strStandardModules = "none";
IF NOT (@optionalModules = 'none'

Het lijkt me verstandig even stap voor stap te debuggen, het probleem zit waarschijnlijk ergens anders als waar je nu zoekt

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Hmmm,
Ik gebruik altijd
code:
1
 IF NOT(@var is null) BEGIN ..
in mijn procedures.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
ook
code:
1
IF NOT(@var is null) BEGIN..
biedt geen soelaas

--Ik wordt gek--

Roomba E5 te koop


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Voordat je kunt testen op NULL moet het veld als NULL worden gedefinieerd (zie mijn vorige post)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Robbemans schreef op 21 november 2003 @ 13:00:
Voordat je kunt testen op NULL moet het veld als NULL worden gedefinieerd (zie mijn vorige post)
Nee hoor, dat is alleen dat de var een NULL waarde krijgt als hij niet wordt doorgegeven aan de proc.

@TS: if @var IS NULL moet gewoon werken voor testen of een variabele NULL is, dat niet werkt duidt aan dat het probleem ergens anders zit. Zoals ik al zei, even stapje voor stapje debuggen, en controleren welke waarde je waar krijgt.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Wat is de exacte foutmelding dan?

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
C#:
1
Response.Write("-" + strOptionalModules + "-");
levert een lege string op

C#:
1
Response.Write(strOptionalModules.Lenght);
is 0.

Hoe kan ik zien wat SQL Server ontvangt als variabele?

Edit:
De foutmelding: INSERT statement conflicted with COLUMN FOREIGN KEY constraint 'FK_xProductModuleOptions_Module', wat komt omdat de SP nu dus een lege waarde probeert te inserten, wat dus niet mag omdat het veld onderdeel van de primary key is.

[ Voor 41% gewijzigd door sig69 op 21-11-2003 13:15 ]

Roomba E5 te koop


  • EfBe
  • Registratie: Januari 2000
  • Niet online
sig69 schreef op 21 november 2003 @ 13:10:
Hoe kan ik zien wat SQL Server ontvangt als variabele?
server trace gebruiken. Dit kan bv mbv sql profiler.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
Dat heb ik nog nooit gebruikt, maar goed.
Ik zie nu in de trace "IF NOT (@optionalModules = NULL)" wel staan, maar kan ik dan ook nog zien of dat als waar of onwaar wordt geevalueerd? Of wat @optionalModules als inhoud heeft?

[ Voor 4% gewijzigd door sig69 op 21-11-2003 13:40 ]

Roomba E5 te koop


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Probeer de sp eens uit te voeren vanuit Query Analyzer waarbij je expliciet een variabele met de waarde NULL doorgeeft.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
Als ik dat doe krijg ik deze foutmelding: Server: Msg 515, Level 16, State 2, Procedure crm_updateProductDetails, Line 102
Cannot insert the value NULL into column 'moduleID', table 'Atompro4.dbo.xProductModuleOptions'; column does not allow nulls. INSERT fails.
The statement has been terminated.

Als ik een waarde invul die hij hoort te krijgen dan werkt hij wel goed.

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Kan je in je C# applicatie niet checken of die string die je gaat doorgeven al of niet leeg is, zo dus:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
string s = string.Empty;

// Bouw hier die string op.

// Geef de string door aan de sp
if( s == string.Empty )
{
    myCommand.Parameters["@p_Param"].Value = DBNull.Value;
}
else
{
    myCommand.Parameters["@p_Param"].Value = s;
}


En in je SP ga je dan gewoon checken op NULL :
code:
1
2
IF @p_Param IS NOT NULL
END

https://fgheysels.github.io/


  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

Als er alleen tab (weet je wel met die tab knop) karakter in je string zit. Dan werken al die is null, len > 0, ='' niet mer je moet perse op die tab karakter checken.
Ik zou even proberen of er alleen tab in zit...

edit: dit klopt niet met die foutmelding..

ik heb niet met ASP.NEt enzo gewerkt maar,
code:
1
updateProductCommand.Parameters.Add(new SqlParameter("@optionalModules", SqlDbType.VarChar, 100)).Value = strOptionalModules;

klopt dit wel, want volgens mij voeg je nog een parameter toe aan je sp terwijl die al bestaat?
Dus niet parameters.Add maar gewoon parameters.paramBYname['@optionalModules'].value (syntax zal wel niet kloppen) gebruiken?

[ Voor 54% gewijzigd door cimbom op 21-11-2003 14:11 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:38
whoami schreef op 21 november 2003 @ 13:52:
Kan je in je C# applicatie niet checken of die string die je gaat doorgeven al of niet leeg is, zo dus:
Ok, dat lijkt te werken (eindelijk!). Thnx guys!

Roomba E5 te koop

Pagina: 1