[T-SQL] Hoe een tabel doorlopen in user defined function

Pagina: 1
Acties:

  • Toink
  • Registratie: Januari 2000
  • Niet online
Momenteel ben ik bezig met het ontwerpen van een soort van flexibele statement; een sterk vereenvoudigd voorbeeld:

SQL:
1
2
3
SELECT *
FROM CUSTOMER
WHERE GETPARAM(WOONPLAATS)


Die getparam is een functie die de voorwaarden uit een tabel haalt. In die tabel kan dus één rij staan met een '*' of 'LIKE '%ERDAM', maar er kunnen ook 3 rijen in staan met bijv. 'Eindhoven', 'Breda', 'Groningen'.

Uiteindelijk komt de query er dus zo uit te zien:
SQL:
1
2
3
SELECT *
FROM CUSTOMER
WHERE WOONPLAATS='EINDHOVEN' OR WOONPLAATS='BREDA' OR WOONPLAATS='ROTTERDAM'


Al die logica heb ik al geprogrammeerd in een user defined function. Het enige wat mij niet lukt is het daadwerkelijk door die woonplaats-tabel lopen en één voor één de waarden eruit halen. Hier zijn truukjes voor, zoals het gebruik van een cursor of een simpel loopje, maar die werken volgens diverse bronnen niet in een user defined function (sql server geeft errormessage 444: "select statements within a function cannot return data to a client").

Op internet lees ik dat je dan per sé een stored procedure moet gebruiken, maar een stored procedure kun je vervolgens niet gebruiken wanneer je code wil plakken in een SQL-statement.

Maw: Wat zou een handige manier zijn om dit op te lossen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Heb je al eens geprobeerd om een cursor in een UDF te declareren ? Dat zou nl. moeten lukken:
The types of statements that are valid in a function include:

DECLARE statements can be used to define data variables and cursors that are local to the function.
Net ff getest, en het blijkt te lukken. (Als in, de functie wordt gemaakt).

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Dit hoort trouwens thuis in Programming.
-> PRG

https://fgheysels.github.io/


  • Toink
  • Registratie: Januari 2000
  • Niet online
Ik twijfel even of ik nou dichterbij of verder van huis ben. Zie beneden voor wederom versimpelde en geknipte code:

SQL:
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
CREATE FUNCTION dbo.GetParam (@PARAM As Varchar(255))  
RETURNS VARCHAR(255) AS  

BEGIN 

DECLARE @ParamString varchar(255)
DECLARE @ROWCOUNTER INT
DECLARE @VALUESET VARCHAR(255)

SELECT @ROWCOUNTER = COUNT(*) FROM DBO.WOONPLAATS
WHILE @ROWCOUNTER > 1
    BEGIN
        SELECT @VALUESET = MIN(WOONPLAATS) FROM DBO.WOONPLAATS
        WHILE @VALUESET IS NOT NULL
        BEGIN
            SET @PARAMSTRING = @PARAMSTRING + @VALUESET + '"'
            SET @ROWCOUNTER = @ROWCOUNTER - 1
            SET @PARAMSTRING = @PARAMSTRING + ' OR "'
            SELECT @VALUESET = MIN(WOONPLAATS) FROM DBO.WOONPLAATS WHERE WOONPLAATS > @VALUESET 
        END
    END

SET @PARAMSTRING = @PARAMSTRING + @VALUESET + '"'

RETURN @ParamString

END


Volgens mij zou dit moeten werken maar om één of andere reden krijg ik totaal geen output in de Messages-box van de MS SQL server Query Analyzer? Ook geen error dus of boodschap dat de transactie afgerond is. In dit geval kon ik de functie dus wel gewoon aanmaken.... In de trace zie je ook dat de functie keurig doorlopen wordt en dat alles netjes afgerond is, precies zoals je het zou verwachten met als laatste boodschap onderin het de statusbar van het scherm "Querybatch completed".....

Is de server nou de kluts kwijt??

[ Voor 11% gewijzigd door Toink op 03-05-2007 11:53 ]


  • xos
  • Registratie: Januari 2002
  • Laatst online: 25-11 17:08

xos

@paramstring is null

Als je daar iets achter plakt zal hij null blijven lijkt me.

null + "string" = null