2010-05-06 6 views
3

Est-il possible de transmettre une donnée dans SQL Server 2005 ou 2008?Passage d'un DataTable dans une procédure stockée. Y a-t-il un meilleur moyen?

Je connais la manière standard de transmettre du XML à un SP. Et un datatable peut facilement être converti en XML en quelque sorte pour le faire. Qu'en est-il de la transmission d'un objet .NET dans un fournisseur de services?

Est-ce possible ?

Je me souviens avoir entendu parler de SQL et CLR travaillant ensemble en 2008 mais je n'ai jamais compris. Peut-être que cela signifie que vous pouvez vous référer aux objets .NET dans une procédure stockée?

Répondre

8

Vous pouvez créer un type de table défini par l'utilisateur dans SQL. Ensuite, dans la procédure stockée, acceptez un paramètre de type (votre type de table défini par l'utilisateur) et transmettez-lui une donnée comme valeur pour une procédure stockée.

Voici quelques exemples de http://msdn.microsoft.com/en-us/library/bb675163.aspx:

Dans SQL:

CREATE TYPE dbo.CategoryTableType AS TABLE 
    (CategoryID int, CategoryName nvarchar(50)) 

Puis:

// Assumes connection is an open SqlConnection object. 
using (connection) 
{ 
// Create a DataTable with the modified rows. 
DataTable addedCategories = 
    CategoriesDataTable.GetChanges(DataRowState.Added); 

// Configure the SqlCommand and SqlParameter. 
SqlCommand insertCommand = new SqlCommand(
    "usp_InsertCategories", connection); 
insertCommand.CommandType = CommandType.StoredProcedure; 

SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
    "@tvpNewCategories", addedCategories); 
tvpParam.SqlDbType = SqlDbType.Structured; 

// Execute the command. 
insertCommand.ExecuteNonQuery(); 
} 
+0

qui est dans SQL Server 2008 ** ** et plus récent que - ne fonctionne pas en 2005 :-( –

+0

Nous utilisons 2008. Je l'ai envoyé à mes patrons, ils peut-être plus facile que d'écouter son passage.. – punkouter

+0

Bonne capture sur le ne fonctionne pas en 2005. Je pense qu'il est plus facile que de passer en XML.Une autre grande utilité pour cela est lorsque vous passez une liste d'éléments à une procédure stockée. La pratique courante consiste à faire une liste délimitée d'identifiants, à les transmettre et à les analyser dans la procédure stockée.Avec un type de table, vous pouvez passer une table contenant vos données, puis JOIN comme une table normale. –

0

que vous pouvez choisir SQl d'insertion en bloc.

J'ai essayé, le meilleur moyen.

enter code here 

    Using dbConn As New SqlConnection(connectionStr) 
       dbConn.Open() 
       countStart = System.Convert.ToInt32(commandRowCount.ExecuteScalar()) 



       Using bulkcopy As SqlBulkCopy = New SqlBulkCopy(dbConn) 
        bulkcopy.DestinationTableName = "[dbo].[DocumentScan]" 
        Try 
         ' Write from the source to the destination. 
         bulkcopy.WriteToServer(newDataTable) 

        Catch ex As Exception 
         Console.WriteLine(ex.Message) 
        End Try 
        Dim countEnd As Long = _ 
        System.Convert.ToInt32(commandRowCount.ExecuteScalar()) 


       End Using