Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[T-SQL] rijen inserten op basis van aantal...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem:

tabelX: id, aantal
tabelY: id, x_id

op tabelX zit een AFTER INSERT trigger, die in tabelY het aantal rijen moet toevoegen dat in tabelX is aangegeven door 'aantal'.

ik heb het nu met een cursor en een while loop opgelost, die de 'inserted' set doorloopt en dan de while loop [aantal] keer doorloopt en een INSERT doet.
Deze oplossing is nou niet bepaald snel.

mijn vraag: hoe los ik dit (zonder cursor / while loop) op.

als ik dus het volgende in tabelX stop:
a, 1
b, 2
c, 4

dan moet in tabelY het volgende komen:
a
b
b
c
c
c
c

enig idee?

  • whoami
  • Registratie: December 2000
  • Nu online
Maak een tabel waarin je gewoon een sequence van nummers bijhoudt.
Je kan die tabel dan gebruiken om je tabelY op te vullen.

Bv, die 'sequencetabel' bevat 1000 records (van 1 tot 1000)

Als je als aantal 5 ingeeft, dan doe je in je trigger:
code:
1
2
3
4
insert into tabel_Y ( veld )
select <ingegeven_waarde>
from sequencetabel
where sequencetabel.nummer <= 5

[ Voor 4% gewijzigd door whoami op 18-03-2008 15:03 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Dit heeft trouwens niets met DTE te maken;
-> PRG

https://fgheysels.github.io/


Verwijderd

Topicstarter
,,Visual Studio, SQL Server en Photoshop zijn natuurlijk hele mooie programma's, maar ze doen lang niet altijd wat we willen. Bespreek hier al je problemen met ontwikkelingssoftware.''

ook niet echt een duidelijke omschrijving voor dat forum dan... (zeg dan: MSSQL Management Studio o.i.d.).
maar goed. dan weet ik dat :)

Ik snap het principe, bedankt! gaat wel lukken zo denk ik.

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op dinsdag 18 maart 2008 @ 15:12:
,,Visual Studio, SQL Server en Photoshop zijn natuurlijk hele mooie programma's, maar ze doen lang niet altijd wat we willen. Bespreek hier al je problemen met ontwikkelingssoftware.''
Wel, jouw topic beschrijft geen probleem met de ontwikkelingssoftware.
Jouw probleem, is een programmeerprobleem.

https://fgheysels.github.io/


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je zou een managed trigger kunnen schrijven. Je kunt dan in een c#/vb.net een vertrouwde loop gebruiken om records te inserten.

C#:
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
[SqlTrigger(Name="InsertRowsTrigger", Target="dbo.tabel_x", Event="AFTER INSERT")]
public static void InsertRowsTrigger()
{
  SqlTriggerContext ctxTrigger = SqlContext.TriggerContext;
  int requestedRows = GetRequestedRowsFromContext(ctxTrigger.EventData);

  SqlCommand cmd = new SqlCommand();
  cmd.Text = "INSERT INTO table_y(veld) VALUES (@v)";
  cmd.Connection = new SqlConnection("context connection=true");
  cmd.Parameters.AddWithValue("@v", "XXXXX");

  try
  {
    cmd.Connection.Open();
    for(int i = 0; i < requestedRows; i++)
      cmd.ExecuteNonQuery();
  }
  finally
  {
     cmd.Connection.Close();
  }
}

private static int GetRequestedRowsFromContext(SqlXml eventData)
{
   return 2; //eventData bevat de nieuwe row en hier kun je ook velden uitlezen
}


Managed triggers zijn erg snel en op zich eenvoudig te schrijven. Ook kun je eenvoudiger code delen tussen de database en je applicatie. Als je aan een c# structure de Serialize() en SqlUserDefinedType attributen toe kent, dan kun je deze gebruiken in zowel je code, maar ook als een column type in een tabel. Hiermee kun je workarounds met MemoryStreams en BinaryFormatters achterwege laten.

Het gebruik van managed code op je database maakt het later wel lastiger om over te stappen op een andere database, maar je bestaande T-sql triggers en procedures kun je ook niet meenemen.

If it isn't broken, fix it until it is..


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:21

TeeDee

CQB 241

Hey, dat is een interessante optie. Weer wat geleerd. Vind het gebruik van triggers SQL side altijd lastig omdat dat altijd van die dingen zijn die je vergeet. Dit houdt het e.e.a. overzichtelijker.

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Topicstarter
ik heb het opgelost met T-SQL. Dat was qua performance toch stukken beter.

Bedankt in ieder geval!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 10:21

TeeDee

CQB 241

Dat heb je vrij vlot gezien / grondig uitgetest. ;)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Verwijderd schreef op dinsdag 18 maart 2008 @ 18:32:
ik heb het opgelost met T-SQL. Dat was qua performance toch stukken beter.

Bedankt in ieder geval!
Managed triggers zijn bij ons 25-50% sneller dan de T-SQL triggers. Via de SQL Server profiler ben je daar zo achter. Zeker bij FOR CURSOR/WHILE FETCH constructies zijn grote winsten te behalen. Ik heb wel geconstateert dat T-sql triggers sneller zijn als je trigger beperkt blijft tot een lookup of simpele validatie. Omdat je continue met vaste inserts werkt, zal de oplossing van whoami ook snel zijn.

Ik zie alleen het nut niet dat je 25 keer dezelfde tekst in de database insert omdat 25 in een data column staat..

(edit: typo)

If it isn't broken, fix it until it is..


  • whoami
  • Registratie: December 2000
  • Nu online
Niemand_Anders schreef op donderdag 20 maart 2008 @ 08:46:
[...]

Managed triggers zijn bij ons 25-50% sneller dan de T-SQL triggers. Via de SQL Server profiler ben je daar zo achter. Zeker bij FOR CURSOR/WHILE FETCH constructies zijn grote winsten te behalen. Ik heb wel geconstateert dat T-sql triggers sneller zijn als je trigger beperkt blijft tot een lookup of simpele validatie. Omdat je continue met vaste inserts werkt, zal de oplossing van whoami ook snel zijn.
Een set based operatie zal in SQL altijd sneller zijn dan gelijk welke loop dat je gebruikt, en of dat nu in een managed trigger zit, of in een gewone trigger, maakt dat niet uit. µ
Ik zie alleen het nut niet dat je 25 keer dezelfde tekst in de database insert omdat 25 in een data column staat..
Ik ook niet, maar we kennen het probleemdomein niet, dus is het moeilijk om daarover te oordelen.

https://fgheysels.github.io/

Pagina: 1