Wederom een SQL vraagje waar ik veel over gezocht heb maar toch niet uitkom:
Ik heb de volgende query (even ingekort):
Nu heb ik een multi-statement table-valued functie geschreven, zie hieronder een ingekorte versie:
Wanneer ik deze functie nu aanroep zonder parameters wordt de default waarde voor @segment genomen. Die heb ik ingesteld op 'IS NOT NULL' wat neerkomt op alle waarden (want deze waarde is nooit null), echter komt dan in de query:
En de = operator voor IS NOT NULL kan niet. Ik kan deze operator niet weghalen want als er wel een int waarde voor @segment wordt toegekend aan de functie wil ik dat de query blijft kloppen.
Na veel lezen hierover op internet las ik dat het niet mogelijk is om een EXEC statement te draaien, zoals bijv.
Hoe kan ik er dus voor zorgen dat wanneer de functie zonder @segment parameter wordt aangeroepen alle records worden teruggegeven en wanneer ik wel een @segment parameter waarde (=integer) invoer ik alleen de records krijg met die waarde?
Hoop dat alles duidelijk is hierboven...
Documentatie die ik o.a. heb nageslagen op internet hierover zijn:
http://www.sommarskog.se/dynamic_sql.html
http://www.informit.com/a...le.aspx?p=130855&seqNum=3
http://doc.ddart.net/mssq...tedb/cm_8_des_08_361x.htm
Ik heb de volgende query (even ingekort):
SQL:
1
2
3
| SELECT omzet_jaarmaand FROM omzetten WHERE omzetten.omzet_segment_uid = @segment |
Nu heb ik een multi-statement table-valued functie geschreven, zie hieronder een ingekorte versie:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| CREATE FUNCTION [dbo].[testfunctie] ( @segment varchar(11) = 'IS NOT NULL' ) RETURNS @resulttable TABLE ( omzet_bedrag int ) AS BEGIN IF ISNUMERIC(@segment) = 1 SET @segment = '= '+@segment INSERT @resulttable SELECT omzet_bedrag FROM omzetten WHERE omzetten.omzet_segment_uid = @segment RETURN END |
Wanneer ik deze functie nu aanroep zonder parameters wordt de default waarde voor @segment genomen. Die heb ik ingesteld op 'IS NOT NULL' wat neerkomt op alle waarden (want deze waarde is nooit null), echter komt dan in de query:
SQL:
1
| WHERE omzetten.omzet_segment_uid = IS NOT NULL |
En de = operator voor IS NOT NULL kan niet. Ik kan deze operator niet weghalen want als er wel een int waarde voor @segment wordt toegekend aan de functie wil ik dat de query blijft kloppen.
Na veel lezen hierover op internet las ik dat het niet mogelijk is om een EXEC statement te draaien, zoals bijv.
SQL:
1
2
3
4
5
6
| DECLARE @sql varchar(2000) SET @sql = 'SELECT omzet_bedrag FROM omzetten WHERE omzetten.omzet_segment_uid '+@segment EXEC(@sql) |
Hoe kan ik er dus voor zorgen dat wanneer de functie zonder @segment parameter wordt aangeroepen alle records worden teruggegeven en wanneer ik wel een @segment parameter waarde (=integer) invoer ik alleen de records krijg met die waarde?
Hoop dat alles duidelijk is hierboven...
Documentatie die ik o.a. heb nageslagen op internet hierover zijn:
http://www.sommarskog.se/dynamic_sql.html
http://www.informit.com/a...le.aspx?p=130855&seqNum=3
http://doc.ddart.net/mssq...tedb/cm_8_des_08_361x.htm
[ Voor 6% gewijzigd door Urk op 25-03-2008 15:13 ]