Blog Stats
  • Posts - 13
  • Articles - 0
  • Comments - 7
  • Trackbacks - 0

 

I Parametri "Table-Valued" di SQLServer 2008

I Parametri "Table-Valued" sono stati introdotti con SQL Server 2008 (sotto sugerimento di Luca Bianchi) e ci permettono di inviare un intera DataTable ad una istruzione T-SQL o Routine senza creare nessuna tabella temporanea o altro del genere.

Per poter inviare l'intera DataTable ho fatto una semplice SP che riceve da una Select i dati dal parametro Table-Value e lo inserisce "INSERT" nella tabella desiderata.

Ecco come ho fatto:

Partiamo da VB e dalla creazione della DataTable.

   1:   Dim dtTable As New DataTable
   2:   Dim col As DataColumn
   3:  col = New DataColumn("ID", GetType(Int32))
   4:  dtTable.Columns.Add(col)
   5:  col = New DataColumn("Descrizione", GetType(String))
   6:  dtTable.Columns.Add(col)

ora inserieamo alcuni dati nella DataTable:

   1:  Dim printRow As DataRow = dtTable.NewRow
   2:  printRow("ID") = 1
   3:  printRow("Descrizione") = "Patate di stagione"
   4:  dtTable.Rows.Add(printRow)
   5:  printRow("ID") = 2
   6:  printRow("Descrizione") = "Arance Siciliane"
   7:  dtTable.Rows.Add(printRow)
   8:  printRow("ID") = 3
   9:  printRow("Descrizione") = "Mele di stagione"
  10:  dtTable.Rows.Add(printRow)

 

Ora andiamo su SQL con il Manageri di SQL2008 e creamo un Type personalizzato di tipo Table-Value:

   1:  CREATE TYPE dbo.TTableType AS TABLE
   2:      ( ID int, Descrizione nvarchar(Max) )
 
Ora creamo la Stored Procedure con il parametro di tipo Table-Value appena creato:
   1:  create PROCEDURE [dbo].[SpInTable] 
   2:  (@Tab dbo.TTableType readonly ) 
   3:   
   4:  AS 
   5:   
   6:  BEGIN TRAN 
   7:  SET NOCOUNT OFF; 
   8:   
   9:  INSERT INTO 
  10:  [intec].[dbo].[TabMia] (ID, Descrizione )
  11:      SELECT ID, Descrizione FROM @Tab;
  12:   
  13:  COMMIT TRAN 
Perfetto. Ora non ci rimane altro che trasmettere la DataTable alla Stored Procedure dal nostro progetto VB:
   1:  Dim insertSpInTable As New SqlCommand("SpInTable", CnnS)
   2:  insertSpInTable.CommandType = CommandType.StoredProcedure
   3:  Dim ParamT As SqlParameter = insertSpInTable.Parameters.AddWithValue("@Tab", SqlDbType.Structured)
   4:  ParamT.SqlDbType = SqlDbType.Structured
   5:  ParamT.TypeName = "dbo.TTableType"
   6:  ParamT.Value = dtFR
   7:  insertSpInTable.ExecuteNonQuery()

Eccolo qui. Abbiamo passato un intera DataTable in una tabella SQL senza fare nessun ciclo come per esempio facevamo con VB6 e Access. Veramente molto veloce e preciso con una transazione sola. Questo potrebbe essere comodo per inserire, ad esmpio, i dettagli di una fattura, DTT o altro.
Spero che vi potrà essere utile nei vostri progetti altrimenti scusate per la noia arrecatovi. :-) :-)


Feedback

No comments posted yet.


Post a comment





 

Please add 7 and 5 and type the answer here:

 

 

Copyright © Stefano Pranzo