[MSSQL] REPLACE '

Pagina: 1
Acties:

  • Siliakus
  • Registratie: November 2000
  • Laatst online: 21-08 15:00
Ik probeer de ' te replacen door '' omdat dit fout gaat bij het parsen van een update statement.

Echter kan dit niet dmv van REPLACE(@invoer, ''', ''''') of REPLACE(@invoer, '', '''') aangezien deze quotes gebruikt worden om begin en eind van een char of string te bepalen.

Hoe kan ik toch zorgen dat een ' omgezet wordt in '' ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Je kan best in je UPDATE, INSERT, DELETE, SELECT statements gebruik maken van parameters ipv ze samen te stellen dmv string-concatenation.
Dan hoef je je helemaal geen zorgen meer te maken om die ' te replacen door ".

https://fgheysels.github.io/


  • Sequence
  • Registratie: Maart 2000
  • Laatst online: 27-05-2024

Sequence

Online marketing

gokje.. escapen met een \ ??

  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Waar replace je ze mee? Ik denk dat je gebruik moet maken van escape tekens, dus bv \'.

  • Siliakus
  • Registratie: November 2000
  • Laatst online: 21-08 15:00
ehm ik denk dat jullie me verkeerd begrijpen. Ik maak een functie welke een andere functie controleert. Hiervoor moet ik de statements die in die functie gebruikt worden parsen. Maar als er in die functie die gecontroleerd wordt wel ' ' gebruikt worden dan loop ik dus tegen een muur omdat mijn eigen functie die ' nog steeds als quotes ziet.

Ik had bedacht dat een goede oplossing zou zijn door de quote door een dubbele quote te vervangen.... andere oplossingen zijn ook welkom?

  • evaarties
  • Registratie: April 2001
  • Laatst online: 18-08 16:51

evaarties

Powerball @ 12.582

Wat bedoel je met controleren? zou je een voorbeeld kunnen laten zien?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Replacen voordat het naar de DB gestuurd word is het enige juiste antwoord IMHO. Hiermee voorkom je concatenationproblemen in de proc maar wat veel belangrijker is, je voorkomt het grootste risico op SQL injection

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


  • Siliakus
  • Registratie: November 2000
  • Laatst online: 21-08 15:00
Het is een parser om kolommen en hun waarden in een tabel door te geven aan een andere functie:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
ALTER FUNCTION fn_parse_update(@invoer VARCHAR(2048)) RETURNS @result TABLE(
tabelnaam VARCHAR(255), actie VARCHAR(255), set_kolom VARCHAR(255), set_waarde VARCHAR(255))
AS
BEGIN
    --DECLARE @invoer VARCHAR(2048)
    DECLARE @positie INT
    DECLARE @tabelnaam VARCHAR(255)
    DECLARE @aantal_sets INT
    DECLARE @set_kolom VARCHAR(255)
    DECLARE @set_waarde VARCHAR(255)
    DECLARE @aantal_haakjes_openen INT
    DECLARE @aantal_haakjes_sluiten INT
    DECLARE @haakjes_gelijk INT
    DECLARE @temp VARCHAR(255)
    --SET @invoer = '     Update _Opdracht   Set OpdrachtAanmaakDT = dbo.fn_TimeNil( getdate()),   OpdrachtHistorie = "Aangemaakt op: "+ CONVERT(varchar(10), GetDate(), 104)   Where       '
    SET @invoer = LTRIM(RTRIM(@invoer))
    SET @temp = @invoer
    SET @haakjes_gelijk = 0

    
    -- Haal UPDATE weg, sla tabelnaam op en haalt tabelnaam + SET weg
    SET @invoer = SUBSTRING(@invoer, 8, LEN(@invoer) - 7)
    SET @positie = CHARINDEX(' ', @invoer)
    SET @tabelnaam = SUBSTRING(@invoer, 1, @positie - 1)
    SET @invoer = LTRIM(RTRIM(SUBSTRING(@invoer, @positie + 6, LEN(@invoer) - @positie)))
    SET @positie = dbo.fn_zoek_keyword('WHERE', @invoer, ' ')
    SET @invoer = SUBSTRING(@invoer, 1, @positie)
    
    -- Controleer hoeveel waarden er 'ge-set' worden en sla de waarden/kolommen op
    SET @aantal_sets = dbo.fn_aantal_char(@invoer, ',') + 1
    WHILE @aantal_sets != 0
    BEGIN
        IF ( CHARINDEX(',', @invoer)) = 1 SET @invoer = LTRIM(SUBSTRING(@invoer, 2, LEN(@invoer) - 1))
        SET @positie = CHARINDEX(' ', @invoer)
        SET @set_kolom = SUBSTRING(@invoer, 1, @positie - 1)
        SET @invoer = SUBSTRING(@invoer, @positie + 3, LEN(@invoer) - @positie - 2)
        SET @positie = CHARINDEX(',', @invoer)
        IF @positie = 0 
        BEGIN 
            SET @set_waarde = RTRIM(@invoer)
        END
        ELSE 
        BEGIN   
            SET @positie = CHARINDEX(',', @invoer)
            SET @aantal_haakjes_openen = dbo.fn_aantal_char(SUBSTRING(@invoer, 1, @positie - 1), '(')
            SET @aantal_haakjes_sluiten = dbo.fn_aantal_char(SUBSTRING(@invoer, 1, @positie - 1), ')')
            IF (@aantal_haakjes_openen != @aantal_haakjes_sluiten)
            BEGIN
                SET @aantal_sets = @aantal_sets - 1
                WHILE @haakjes_gelijk = 0
                BEGIN   
                    SET @positie = CHARINDEX(',', @invoer, @positie + 1)
                    IF @positie = 0 SET @positie = LEN(@invoer)
                    SET @aantal_haakjes_openen = dbo.fn_aantal_char(SUBSTRING(@invoer, 1, @positie), '(')
                    SET @aantal_haakjes_sluiten = dbo.fn_aantal_char(SUBSTRING(@invoer, 1, @positie), ')')
                    IF (@aantal_haakjes_openen = @aantal_haakjes_sluiten) SET @haakjes_gelijk = 1
                    ELSE SET @aantal_sets = @aantal_sets - 1
                END
            END
            SET @set_waarde = SUBSTRING(@invoer, 1, @positie - 1)
            SET @invoer = LTRIM(RTRIM(SUBSTRING(@invoer, @positie + 1, LEN(@invoer) - @positie)))
        END
        SET @aantal_sets = @aantal_sets - 1
        INSERT INTO @result VALUES (@tabelnaam, 'UPDATE', @set_kolom, @set_waarde)
    END
    RETURN
END

[ Voor 4% gewijzigd door Siliakus op 23-09-2003 16:32 ]


Verwijderd

Een best-practise:

Zorg ervoor dat je variabele al vóórdat ie naar de stored procedure gestuurd wordt, door een replace-functie wordt gehaald. Elke programmeer-taal heeft hier wel (simpele) mogelijkheden voor en dan hoef je niet moeilijk te doen in SQL.

Trouwens, hoe doe jij dat, in MS SQL een functie gebruiken die de invoer checkt? Da's volgens mij ERG omslachtig...

:7


Oei, ik zie nu net je post hierboven. Waarom doe je dit soort dingen in een SQL-functie??? Dat hoort naar mijn bescheiden mening toch echt in een programmeertaal thuis.
En invoer controleren voor bijv. een update kan je dan veel makkelijker doen d.m.v. Stored Procedures. Heb je ook geen last meer van enkele quotes.

[ Voor 31% gewijzigd door Verwijderd op 23-09-2003 16:36 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op 23 September 2003 @ 16:33:
Een best-practise:


Oei, ik zie nu net je post hierboven. Waarom doe je dit soort dingen in een SQL-functie??? Dat hoort naar mijn bescheiden mening toch echt in een programmeertaal thuis.
En invoer controleren voor bijv. een update kan je dan veel makkelijker doen d.m.v. Stored Procedures. Heb je ook geen last meer van enkele quotes.
Helemaal mee eens!

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


  • Siliakus
  • Registratie: November 2000
  • Laatst online: 21-08 15:00
Ja dat is dus het probleem, ik kan java, maar dat willen ze hier niet -> dan wordt het Delphi, welke ik niet ken. Dus keuze was of in db zelf (enige sql ervaring) of in Delphi (geen ervaring)

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Siliakus schreef op 23 september 2003 @ 16:56:
Ja dat is dus het probleem, ik kan java, maar dat willen ze hier niet -> dan wordt het Delphi, welke ik niet ken. Dus keuze was of in db zelf (enige sql ervaring) of in Delphi (geen ervaring)
Dan leer je Delphi.
Gebruik de juiste taal voor de taak die je moet doen. Als je die taal niet kent, dan leer je ze maar.

https://fgheysels.github.io/


  • Siliakus
  • Registratie: November 2000
  • Laatst online: 21-08 15:00
ehm het is een stage en dit een 'bij'-opdracht. Ik heb gewoon simpelweg de tijd niet om een nieuwe taal aan te leren.

Verwijderd

Uhm, ofwel begrijp ik de vraag niet goed, ofwel is volgens mij gewoon uw syntax verkeerd:

REPLACE(@invoer, ''', ''''') of REPLACE(@invoer, '', '''') werkt niet; je moet de quotes die zelf binnen quotes staan, verdubbelen.

Dus:
Replace(@invoer, '''', '''''') => dus 4 en 6 quotes respectievelijk...
Pagina: 1