[SQL/ASP.NET] Server side data aanpassen met sql

Pagina: 1
Acties:

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
Ik wil een datagrid vullen met data via een stored procedure. In deze stored procedure word mbv een cursor data in variabelen geplaatst en de inhoud van de variabelen wordt daarna aangepast. Daarna worden de variabelen aan een select opdracht toegevoegd.

Tot zover gaat alles goed. Het probleem is echter dat het datagrid wat ik gebruik maar één rij laat zien. Alleen de eerste rij. De overige rijen worden wel gegenereerd, maar komen niet aan bij de datagrid. Dit komt denk ik doordat elke rij met een aparte select opdracht wordt gegenereerd, waardoor er eigenlijk voor elke rij een aparte tabel ontstaat.

Is het mogelijk om die aparte tabellen in sql weer samen te voegen tot één tabel?

Hieronder staat de stored procedure om het één en ander te verduidelijken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE PROCEDURE test 
  AS 
  DECLARE @pid INT 
  DECLARE @uid INT 
  DECLARE @vol INT 
  DECLARE Photos_cursor CURSOR SCROLL FOR 
  SELECT PhotoID,UserID,Volgorde FROM Photos ORDER BY Volgorde 
  OPEN Photos_cursor 
  FETCH RELATIVE 2 FROM Photos_cursor 
  INTO @pid, @uid, @vol 
  WHILE @@FETCH_STATUS = 0 
  BEGIN 
    -- This is executed as long as the previous fetch succeeds. 
    SELECT CONVERT(char(6), @pid), CONVERT(char(6), @uid), CONVERT_
    (char(6), @vol) 
    FETCH RELATIVE 2 FROM Photos_cursor 
    INTO @pid, @uid, @vol 
  END 
  CLOSE Photos_cursor 
  DEALLOCATE Photos_cursor 
  GO

[ Voor 3% gewijzigd door Swerfer op 28-11-2003 14:57 ]

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • whoami
  • Registratie: December 2000
  • Nu online
Wat is de bedoeling van die cursor?
Waarom kan je het niet gewoon met een simpel SQL statement in je procedure verwezenlijken?

Het probleem is dat je procedure eigenlijk geen waardes heeft om te tonen, zoals je al gezien hebt, wordt er idd slechts 1 row in je datagrid getoond.

Als je die cursor (en die loop echt nodig hebt), kan je werken met een temporary table. In je loop in je procedure ga je dan ieder record dat je gefetched (en daarna bewerkt hebt), gaan inserten in die temp. table.
Op het einde van je procedure ga je dan alles uit die temporary table selecten, en dat zou moeten 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
CREATE PROCEDURE test
AS
BEGIN

CREATE TABLE #temptabel
(
veld        CHAR(6),
veld2      CHAR(6),
veld3      CHAR(6)
)

....
WHILE @@FETCH_STATUS = 0
BEGIN

...
INSERT INTO temptabel (veld1, veld2, veld3)
VALUES (@pid, @uid, @vol)

END

....

SELECT * FROM #temptabel
END

https://fgheysels.github.io/


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
Dit ga ik eens proberen. Ik moet namelijk een loop hebben omdat ik de variabelen meer wil gaan aanpassen dan ik in het voorbeeld heb weergegeven.

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
Dit was precies wat ik zocht, ik heb een test stored procedure gemaakt die werkt. Bedankt...

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
CREATE PROCEDURE test
    AS
    if exists (select * from dbo.sysobjects where id = object_id(N'[temptabel]')_
    and OBJECTPROPERTY(id, N'IsUserTable') = 1)
        drop table [temptabel]

    CREATE TABLE temptabel
    (
    veld1 CHAR(10),
    veld2 CHAR(100),
    veld3 CHAR(10),
    veld4 CHAR(100)
    )
    DECLARE @veld1 INT
    DECLARE @veld2 INT
    DECLARE @veld3 INT
    DECLARE @veld4 INT
    DECLARE Photos_cursor CURSOR SCROLL FOR
    SELECT UserID,PhotoID FROM Photos ORDER BY Volgorde
    OPEN Photos_cursor
    FETCH NEXT FROM Photos_cursor
    INTO @veld1, @veld2
    FETCH NEXT FROM Photos_cursor
    INTO @veld3, @veld4
    WHILE @@FETCH_STATUS = 0
        BEGIN
            INSERT INTO temptabel (veld1, veld2, veld3, veld4)
            VALUES (@veld1, '<img src=''' + CONVERT(varchar(6), @veld2) + '.gif_
             ''>', @veld3, '[img]'''[/img]')
            IF @@FETCH_STATUS = 0
                BEGIN
                    FETCH NEXT FROM Photos_cursor
                    INTO @veld1, @veld2
                END
            IF @@FETCH_STATUS = 0
                BEGIN
                    FETCH NEXT FROM Photos_cursor
                    INTO @veld3, @veld4
                END
        END
    CLOSE Photos_cursor
    DEALLOCATE Photos_cursor
    SELECT * FROM temptabel
    DROP TABLE temptabel
GO

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • whoami
  • Registratie: December 2000
  • Nu online
Jouw 'temptabel' is niet echt een temporary table.

Temporary tables specifieer je door hun naam met een # (local temp.) of ## (global temp.) te laten beginnen.
Als ik me goed herinner, dan worden die temporary tables automatisch gedropt als er buiten hun scope gegaan wordt, en ze zijn ook efficienter: ze worden in de tempdb database aangemaakt.

https://fgheysels.github.io/


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
Opnieuw bedankt, het is met een 'echte' temp tabel inderdaad niet nodig om die te droppen, en dus is het ook niet nodig om te controleren of de tabel al bestaat.

_/-\o_

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 04-04 23:16
whoami schreef op 28 november 2003 @ 16:23:
...ze zijn ook efficienter: ze worden in de tempdb database aangemaakt.
Verwacht niet te veel van temporary tables. Mijn ervaring is dat het gebruik van temporary tables als het om performance gaat zo veel mogelijk uit te sluiten.

Problem Exists Between Chair And Keyboard


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
majornono schreef op 28 november 2003 @ 17:06:
[...]


Verwacht niet te veel van temporary tables. Mijn ervaring is dat het gebruik van temporary tables als het om performance gaat zo veel mogelijk uit te sluiten.
Ik heb nu gekozen voor TABLE VARIABLES wat een stuk performance winst zou moeten opleveren.

Met een beetje googelen op 'performance temporary tables sql server' ben ik erachter gekomen dat TABLE VARIABLES bestaan, die vrijwel gelijk werken als temp tables, maar volledig in het geheugen opgeslagen worden, als er genoeg geheugen is.

http://www.eggheadcafe.com/articles/20010823.asp

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com

Pagina: 1