none
[sql server] Stored procedure per leggere e salvare dati in altre tabelle RRS feed

  • Domanda

  • Ciao a tutti

    Ho iniato ad utilizzare le stored procedure e mi rivolgo a voi esperti per capire come fare questo:

    Ho queste 2 tabelle:

    Tabella supplementi tb1
    ID fkCat prezzo

    Tabella multilingua tb2
    ID fkTb1 testo lingua

    La relazione tra tb1 e tb2 è 1 a molti

    Da c# voglio richiamare una stored procedure alla quale passo un insieme di ID di tb1 e salvare i dati corrispondeti letti da tb1 e tb2 in altre tabelle. Le operazioni da fare sono queste:

    1. leggere i dati di tb1 e salvarli in tb3 (che ha più o meno la stessa struttura)

    2. Salvare i dati di tb2 associati all'id di tb1, sempre in tb2 ma fkTb1 è uguale all'id generato al passo 1 per tb3

    Tutto questo ho capito come fare se leggo una sola riga di tb1, ma non ho idea su come fare se passo un insieme di id.

    Inoltre, come passo come parametro l'insieme di id alla stored procedure?

    Grazie mille

    lunedì 13 agosto 2018 07:21

Risposte


  • Da c# voglio richiamare una stored procedure alla quale passo un insieme di ID di tb1 e salvare i dati corrispondeti letti da tb1 e tb2 in altre tabelle...

    Tutto questo ho capito come fare se leggo una sola riga di tb1, ma non ho idea su come fare se passo un insieme di id.

    Ciao,

    al link che ha suggerito Edoardo trovi diverse soluzioni, il mio consiglio è quello di utilizzare Table-Valued Parameters (TVPs), disponibile a partire dalla versione 2008 di SQL Server.

    Table-Valued Parameters offre la possibilità di passare a stored procedure e function definite dall'utente, parametri di tipo tabella, nel tuo caso una tabella con tutti gli ID.

    La necessità di passare una struttura dati come parametro ad una stored procedure o ad una function veniva spesso risolta con un workaround che consiste nel passare parametri di tipo XML o Comma Separeted String. Queste soluzioni, tipicamente, richiedono però la stesura di parecchio codice T-SQL che difficilmente potrà scalare in modo ottimizzato in funzione della quantità dei dati trattati.

    Table-Valued Parameters, invece, essendo parametri fortemente tipizzati e generalmente più efficienti di quelli di tipo XML e Comma Separeted String, permettono di scrivere meno codice, meno complesso e decisamente più performante.. questo è un piccolo estratto dell'articolo Table-Valued Parameters in Action.


    Ciao!


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    martedì 14 agosto 2018 22:45
    Moderatore
  • il problema è che dovresti passare alla stored procedure un'array di lunghezza variabile di parametri e questo non è il modo usuale di operare.

    normalmente quando costruisci una function, a cui la stored procedure assomiglia per logica, la fai dipendere da un numero fisso di parametri che tutte le volte vengono passati per restituire il risultato.

    non è molto logico avere un numero di parametri variabile, però è fattibile.

    ad esempio qui sotto trovi una possibile soluzione.

    https://stackoverflow.com/questions/7462552/stored-procedure-with-variable-number-of-parameters

    ciao


    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    martedì 14 agosto 2018 07:09
    Moderatore

Tutte le risposte

  • per quale motivo con c# vuoi passare un insieme di ID alla stored procedure invece di passare un ID alla volta ?

    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    lunedì 13 agosto 2018 09:53
    Moderatore
  • Per non richiamare la procedura 100 molte ma solo 1
    lunedì 13 agosto 2018 10:57
  • il problema è che dovresti passare alla stored procedure un'array di lunghezza variabile di parametri e questo non è il modo usuale di operare.

    normalmente quando costruisci una function, a cui la stored procedure assomiglia per logica, la fai dipendere da un numero fisso di parametri che tutte le volte vengono passati per restituire il risultato.

    non è molto logico avere un numero di parametri variabile, però è fattibile.

    ad esempio qui sotto trovi una possibile soluzione.

    https://stackoverflow.com/questions/7462552/stored-procedure-with-variable-number-of-parameters

    ciao


    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    martedì 14 agosto 2018 07:09
    Moderatore

  • Da c# voglio richiamare una stored procedure alla quale passo un insieme di ID di tb1 e salvare i dati corrispondeti letti da tb1 e tb2 in altre tabelle...

    Tutto questo ho capito come fare se leggo una sola riga di tb1, ma non ho idea su come fare se passo un insieme di id.

    Ciao,

    al link che ha suggerito Edoardo trovi diverse soluzioni, il mio consiglio è quello di utilizzare Table-Valued Parameters (TVPs), disponibile a partire dalla versione 2008 di SQL Server.

    Table-Valued Parameters offre la possibilità di passare a stored procedure e function definite dall'utente, parametri di tipo tabella, nel tuo caso una tabella con tutti gli ID.

    La necessità di passare una struttura dati come parametro ad una stored procedure o ad una function veniva spesso risolta con un workaround che consiste nel passare parametri di tipo XML o Comma Separeted String. Queste soluzioni, tipicamente, richiedono però la stesura di parecchio codice T-SQL che difficilmente potrà scalare in modo ottimizzato in funzione della quantità dei dati trattati.

    Table-Valued Parameters, invece, essendo parametri fortemente tipizzati e generalmente più efficienti di quelli di tipo XML e Comma Separeted String, permettono di scrivere meno codice, meno complesso e decisamente più performante.. questo è un piccolo estratto dell'articolo Table-Valued Parameters in Action.


    Ciao!


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    martedì 14 agosto 2018 22:45
    Moderatore