[sql] Variabelen declareren binnen een VIEW

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

  • Chillz
  • Registratie: Augustus 2001
  • Laatst online: 21-08 17:47
Ik wil een view maken,
hierin zou echter een variabele moeten komen.

Volgens mn collega gaat dit niet:"geen variabelen in een view"
maar ik kan me herinneren dat ik ooit heb gehoord dat het op de een of andere manier toch echt kan werken...

code:
1
2
3
4
5
6
7
CREATE  VIEW [dbo].[View_Data]
AS

DECLARE @jaartal decimal(4)
SET @jaartal = ((SELECT Algemene_parameters_Huidige_jaar FROM [dbo].[Algemene_parameters]))

SELECT........ AS........ FROM........


in de Select komt de variabele voor, tabelnamen met t huidige jaartal moeten getoond worden (zijn ook andere jaartallen aanwezig namelijk)

Had eerst vooraf gedeclareerd, maar dan krijg je de melding dat Create View de eerste statement moet zijn.
Heb ook geprobeerd een tijdelijke tabel aan te maken en met GO's de Create View toch als eerste te laten 'lijken' staan, maar dan nog staan er variabelen in je View en een declaratie in je script...

weet iemand of het überhaupt mogelijk is variabelen hier te gebruiken?
tips voor mijn script, de plaatsing van de Declare?

Leeg - Sinds 20180907


  • Freee!!
  • Registratie: December 2002
  • Laatst online: 08:37

Freee!!

Trotse papa van Toon en Len!

Standaard kan dit gewoon niet. Mogelijk dat er SQL-dialecten zijn die zoiets wel toestaan, maar ik ken ze niet. Mogelijk is het een idee om aan te geven welke SQL-engine/database je gebruikt.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


  • JohanDM
  • Registratie: Augustus 2002
  • Laatst online: 16-07-2021

JohanDM

Optimist

Er vanuit gaande dat je met MS SQL Server werkt: probeer eens CREATE PROCEDURE ipv CREATE VIEW, dan maak je een stored procedure aan, die net als een view resultaten kan teruggeven

"Two things are infinite: the universe and stupidity. And the former I'm not so sure about." -- Albert Einstein


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:50

JaQ

je kan in een view geen variabelen zetten. De enige oplossing is een script gebruiken of een stored procedure.
Het lijkt me trouwens wel erg handig als je het rdbms er even bijzet.. ;)

Egoist: A person of low taste, more interested in themselves than in me


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Het lijkt me trouwens wel erg handig als je het rdbms er even bijzet..
Het kan natuurlijk ook zo zijn dat hij database onafhankelijk wil proggen, of in ieders geval volgens de SQL standaard.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
In MS SQL Server kan je -geloof ik- gebruik maken van global variables. Variabelen declareren in je View kan niet.

https://fgheysels.github.io/


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:50

JaQ

djluc schreef op 19 August 2003 @ 18:07:
[...]
Het kan natuurlijk ook zo zijn dat hij database onafhankelijk wil proggen, of in ieders geval volgens de SQL standaard.
nofi, maar dat gaat zeker ook lukken als ieder rdbms een ander dialect gebruikt.

Egoist: A person of low taste, more interested in themselves than in me


Verwijderd

whoami schreef op 19 August 2003 @ 18:13:
In MS SQL Server kan je -geloof ik- gebruik maken van global variables. Variabelen declareren in je View kan niet.
Dit klopt.. In een CREATE VIEW kan je geen variabelen definieren en gebruiken. De beste oplossing om een stored procedure aan te maken die er uit ziet, zoals:

CREATE PROCEDURE naam AS

DECLARE @var
@var =
SELECT .....

  • Chillz
  • Registratie: Augustus 2001
  • Laatst online: 21-08 17:47
een procedure zou natuurlijk een mooie oplossing zijn...

ik zit echter gebonden aan Tabel of View,
omdat de enige twee objecten zijn die ik dan later weer in de rapportgenerator kan inlezen... tja, beperkingen he...

gebruik SQL Server btw

ik denk dat als variabelen in een View echt niet gaan werken dat ik dan toch maar gewoon de view moet gaan gebruiken met vaste waarden... en dan, zodra de 'variabele' waarden veranderd zijn, telkens aanpassen. zit niets anders op...

Leeg - Sinds 20180907


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Chillz schreef op 20 August 2003 @ 09:03:
een procedure zou natuurlijk een mooie oplossing zijn...

ik zit echter gebonden aan Tabel of View,
omdat de enige twee objecten zijn die ik dan later weer in de rapportgenerator kan inlezen... tja, beperkingen he...

gebruik SQL Server btw
Kan je dan geen User Defined Function gebruiken die een TABLE returned? Die kan je dan ook in een FROM clausule van een SELECT query gebruiken.

https://fgheysels.github.io/


Verwijderd

kan je in je view gewoon niet je stored proc oproepen waarin je je variable hebt gedeclareerd?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Verwijderd schreef op 20 August 2003 @ 09:35:
kan je in je view gewoon niet je stored proc oproepen waarin je je variable hebt gedeclareerd?
Een view kan alleen maar SELECT statements bevatten.

https://fgheysels.github.io/


Verwijderd

Chillz schreef op 20 August 2003 @ 09:03:
een procedure zou natuurlijk een mooie oplossing zijn...

ik zit echter gebonden aan Tabel of View,
omdat de enige twee objecten zijn die ik dan later weer in de rapportgenerator kan inlezen... tja, beperkingen he...

gebruik SQL Server btw

ik denk dat als variabelen in een View echt niet gaan werken dat ik dan toch maar gewoon de view moet gaan gebruiken met vaste waarden... en dan, zodra de 'variabele' waarden veranderd zijn, telkens aanpassen. zit niets anders op...
Welke rapportgenerator gebruik je dan?
Met crystal reports kun je bijvoorbeeld wel degelijk de gegevens baseren op een stored procedure. Je moet dat alleen even in de instellingen aangeven

  • Chillz
  • Registratie: Augustus 2001
  • Laatst online: 21-08 17:47
Verwijderd schreef op 20 August 2003 @ 09:59:
Welke rapportgenerator gebruik je dan?
Met crystal reports kun je bijvoorbeeld wel degelijk de gegevens baseren op een stored procedure. Je moet dat alleen even in de instellingen aangeven
Cognos Improptu...

alleen tabellen en views
(weet niet of het aan het pakket ligt of aan de installatie, misschien is er alleen hiervoor betaald)

Leeg - Sinds 20180907


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Je kan een UDF maken, en dan een view die die UDF gebruikt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE FUNCTION blaat
RETURNS TABLE
AS

  DECLARE @blaat        INT

BEGIN

     SET @blaat = ....

     SELECT * FROM tabel
     WHERE tabel.id = @blaat

END
GO

CREATE VIEW vw_something
AS
SELECT * FROM blaat()
GO

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Kun je niet gewoon een subquery gebruiken? De query die je nu gebruikt om de waarde aan de variabele toe te wijzen kun je ook in je gewone select gebruiken. Ik zie de reden niet waarom je dit met een variabele zou moeten doen.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
P_de_B schreef op 20 augustus 2003 @ 11:54:
Kun je niet gewoon een subquery gebruiken? De query die je nu gebruikt om de waarde aan de variabele toe te wijzen kun je ook in je gewone select gebruiken. Ik zie de reden niet waarom je dit met een variabele zou moeten doen.
Dat is ook weer waar..... Ik had die query niet echt goed bekeken, maar het is idd goed op te lossen door gebruik te maken van een subquery.

code:
1
2
3
4
5
CREATE VIEW vw_blaat
as
SELECT ...
FROM ...
WHERE jaartal = (SELECT param.jaar FROM param .... )

https://fgheysels.github.io/


  • Chillz
  • Registratie: Augustus 2001
  • Laatst online: 21-08 17:47
omdat de variabele ook IN de namen van kolommen en tabellen binnen mijn view voorkomt

bv. waarde variabele = 2003

tabelnaam = Unit_info_2003
kolomnaam = Unit_info_2003_kolom1

Leeg - Sinds 20180907


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Hmm, ik bedenk me net dat dit alles een beetje tegen het principe van een view ingaat. Je zou gewoon moeten doen

SELECT * FROM vwMijnView
WHERE Jaartal = (SELECT [.. ] )

maar goed, dit is wel gemierenuek

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Chillz schreef op 20 August 2003 @ 12:02:
omdat de variabele ook IN de namen van kolommen en tabellen binnen mijn view voorkomt
Ga je dan je SQL - string dynamisch gaan opbouwen ?

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Chillz schreef op 20 August 2003 @ 12:02:
omdat de variabele ook IN de namen van kolommen en tabellen binnen mijn view voorkomt

bv. waarde variabele = 2003

tabelnaam = Unit_info_2003
kolomnaam = Unit_info_2003_kolom1
Oeps, tijd voor een redesign. Zoek eens wat info over database normalisatie, zoals je het nu hebt blijft problemen geven, daar kun je vanuit gaan. Daarbij komt dat je dynamic SQL zou moeten gebruiken als je het jaartal in als parameter voor de SELECT list wilt doorgeven. Dat kan ook niet in een view.

Als je niets kunt wijzigen aan het db schema zit er niets anders op dan een view voor elk jaar te maken.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
P_de_B schreef op 20 augustus 2003 @ 12:06:
[...]

Als je niets kunt wijzigen aan het db schema zit er niets anders op dan een view voor elk jaar te maken.
Als het zo is, dan geloof ik dat hij met UDF's ook een oplossing kan maken.
Je kan nl. een UDF maken die een TABLE returned, en binnen die UDF kan je ook dynamic SQL gaan uitvoeren dacht ik.....
Die UDF kan je dan in een view gaan gebruiken. (Zoals ik al eerder gepost heb. Wel niet uitgetest).

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 20 augustus 2003 @ 12:09:
[...]


Als het zo is, dan geloof ik dat hij met UDF's ook een oplossing kan maken.
Je kan nl. een UDF maken die een TABLE returned, en binnen die UDF kan je ook dynamic SQL gaan uitvoeren dacht ik.....
Die UDF kan je dan in een view gaan gebruiken. (Zoals ik al eerder gepost heb. Wel niet uitgetest).
Goed idee, heb het even getest en dat gaat goed werken!

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
Use pubs
GO

CREATE TABLE Settings (HasContract bit)

ALTER FUNCTION fngetAuthorsWithContract ()

RETURNS @au table (
    [au_id] [varchar](100)  ,
    [au_lname] [varchar] (40) ,
    [au_fname] [varchar] (20) ,
    [phone] [char] (12) ,
    [address] [varchar](50)  ,
    [city] [varchar] (20) ,
    [state] [char] (2) ,
    [zip] [char] (5)  ,
    [contract] [bit] 
)

AS

BEGIN
INSERT @au
 SELECT * FROM authors WHERE contract = (SELECT HasContract FROM Settings)
RETURN
END
GO


CREATE VIEW vwTesting

AS

SELECT * FROM pubs.dbo.fngetAuthorsWithContract()
GO


-- testen:
INSERT INTO Settings (HasContract) values (1)

SELECT * FROM  vwTesting

UPDATE Settings SET HasContract = 0

SELECT * FROM  vwTesting


Dit moet natuurlijk ook werken voor dynamische SQL enzo. Nogmaals goed idee whoami!

[ Voor 4% gewijzigd door P_de_B op 20-08-2003 12:27 ]

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

Pagina: 1