Avatar billede lklingenberg Nybegynder
31. januar 2004 - 22:55 Der er 14 kommentarer og
2 løsninger

Kalde StoredProcedure eller View med WHERE-betingelse

Hi E,

Jeg har lavet en StoredProcedure (SP) og et view med samme SQL streng (en lang satan med en masse joins fra forskellige tabeller).

Fra min ASP-side kalder jeg mit view med fx SELECT * FROM myView WHERE PK=2. Det går også fint nok, men spm er, om det er mere hensigtsmæssigt at kalde en SP ift. et view? I fald anbefalingen går på SP, hvad er så fordelen(e), og hvordan fletter jeg en WHERE-begtingelse ind i mit SP-kald på min ASP-side?
Avatar billede arne_v Ekspert
31. januar 2004 - 23:05 #1
En SP compiles og kan derfor i nogle tilfælde være hurtigere.

En SP kan returnere flere result set og er på mange måder mere fleksibel.

Hvis du skal bruge en SP skal data til WHERE vel over som argument til SP.
Avatar billede lklingenberg Nybegynder
31. januar 2004 - 23:12 #2
> Hvis du skal bruge en SP skal data til WHERE vel over som argument til SP.
Jeps. Og det er jeg usikker på, hvordan jeg gør (i modtsætningen til i et view, hvor det jo er lige ud ad landevejen).

Normalt kalder jeg mine SP således:

Dim objCmd, objRS
Set objCmd = Server.CreateObject("ADODB.Command")
Set objCmd.ActiveConnection = objConn
objCmd.CommandText = "myStoredProcedure"
objCmd.CommandType = adCmdStoredProc
Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS = objCmd.Execute

Så jeg er ikke helt klar over hvordan jeg videregiver argumentet om, at det ikke er alle records i mit SP der skal output'es, men kun det hvor PK fx er 2.
Avatar billede arne_v Ekspert
31. januar 2004 - 23:27 #3
objCmd.Parameters.Append.CreateParameter(...)
Avatar billede arne_v Ekspert
31. januar 2004 - 23:32 #4
Avatar billede lklingenberg Nybegynder
01. februar 2004 - 01:25 #5
Hm, umiddelbart kan jeg ikke lige få flette min betingelse ind med den model. Jeg kan udfra eksemplet se, at man kan tilføje ekstra parametre (data) til sin SP, men i dette tilfælde handler det jo om at sætte en betingelse for hvilket recordset jeg vil have fat i. Det er muligt, jeg blot ikke kan se nogen sammenhængen, men kan du i så fald ikke give et hurtigt eksempel på, hvordan jeg får flettet den betingelse ind i min SP inden den forlader serveren.
Avatar billede lklingenberg Nybegynder
01. februar 2004 - 01:55 #6
Er det lige så hurtigt at anvende Filter metoden til recordset'et:
objRS.Filter = "PK=2"
Avatar billede mufoxe Nybegynder
01. februar 2004 - 12:25 #7
Som arne_v skriver, gemmes der en execution plan for en SP, hvilket speeder den noget op. Du skal dog være opmærksom på at hvis outputtet fra din SP er meget forskellige fra gang til gang, f.eks. en række nogle gange og tusindvis af række andre gange, kan det være en ulempe at bruge en SP, fordi de eksisterende execution plans ikke er korrekt for kaldet. Du kan oprette din SP med med WITH RECOMPILE, som gør at der laves en ny execution plan hver gang SP kaldes. Det er dog ikke det mest optimale.

Det ville være endnu bedre at bruge et INDEXED VIEW. Ticket er at lave et custered index på en kolonne i dit view. Det gør at viewets output gemmes fysisk på disk og er dermed meget hurtigt at tilgå. Vær opmærksom på at der er nogle ting, som skal være opfyldt for at du kan lave et indexed view:
- VIEW skal oprettes med WITH SCHEMABINDING, som gør at de underliggende tabellers schema ikke kan ændres uden at viewet også opdateres.
- Du kan ikke bruge nondeterministic functions i dit view, en nondeterministisk function er f.eks. GETDATE()

Du må ikke bruge:
- ORDER BY - kan man heller ikke normalt i almindelige views, medmindre med bruger TOP 100%
- COMPUTE, COMPUTE BY
- TOP
- Text, Ntext eller Image felter
- DISTINCT
- MIN, MAX, COUNT, STDEV, VARIANCE, AVG
- Nested queries i FROM klausulen
- Andre VIEWs i viewet
- ROWSET function
- UNION
- Subqueries, OUTER JOIN og self JOIN.
Avatar billede arne_v Ekspert
01. februar 2004 - 17:43 #8
Lyder som det man normalt kalder for "materialized view".
Avatar billede arne_v Ekspert
01. februar 2004 - 17:48 #9
Du putter WHERE betingelsen ind i SELECT i din SP og sender værdien over
som argumnent.
Avatar billede arne_v Ekspert
01. februar 2004 - 17:52 #10
Noget a la:

CREATE PROCEDURE dinprocedure
@val INTEGER
AS
SELECT * FROM tabelnavn WHERE feltnavn = @val
Avatar billede arne_v Ekspert
01. februar 2004 - 17:52 #11
Og et svar.
Avatar billede lklingenberg Nybegynder
03. februar 2004 - 06:03 #12
Jeg har et par text felter og også en enkelt INNER JOIN (den er dog ikke med på mufoxes liste.. en smutter?), så jeg går ikke ud fra, at et indexed view er en option. Til gengæld hentes der kun én række (rekord) pr. databasekald, så en SP som arne_v beskriver er måske den hurtigste metode...?
Avatar billede lklingenberg Nybegynder
03. februar 2004 - 09:42 #13
Hm, kig lige på det her og fortæl mig hvor jeg er blind og døv. Jeg får ingen fejl, men absolut heller ingen data ud ad min ellers så medgørlige SQL Server:

SP SQL:

CREATE PROCEDURE IFI_ifi_admin.procGetPage2 @val INTEGER AS
SELECT    dbo.tblCMS.*, dbo.tblMenu.MenuCode AS MenuCode
FROM        dbo.tblCMS INNER JOIN
              dbo.tblMenu ON dbo.tblCMS.fkMenuUI = dbo.tblMenu.MenuUI
WHERE dbo.tblCMS.fkMenuUI=@val
GO

ASP script:

Dim objCmd, objRS, intPageUI, prmPageUI
intPageUI = Request.QueryString("page")
Set objCmd = Server.CreateObject("ADODB.Command")
Set objCmd.ActiveConnection = objConn
objCmd.CommandText = "procGetPage2"
objCmd.CommandType = adCmdStoredProc
Set prmPageUI = objCmd.CreateParameter("@val", adInteger, adParamInput)
objCmd.Parameters.Append prmPageUI
prmPageUI.Value = intPageUI
Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS = objCmd.Execute
Avatar billede lklingenberg Nybegynder
03. februar 2004 - 15:08 #14
Nå, det virker nu! Er @val et reserveret udtryk? Jeg ændrede dette og så virkede det...?

Jeg takker begge to. arne_v's løsning viste sig at være vejen frem i dette tilfælde, men mufoxes kommentar var relevant og gjorde mig lidt klogere, så det drypper lidt på ham også.

Endnu en gang TAK for hjælpen!
Avatar billede lklingenberg Nybegynder
03. februar 2004 - 15:12 #15
(kan man ikke øge pointtallet for spm i den nye E-udgave?)
Avatar billede arne_v Ekspert
03. februar 2004 - 15:14 #16
Det må det jo så være (selvom jeg ikke lige kan se hvad de skulle betyde).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester