2017-04-12 4 views
0

Je passe dans un TempTable à mon code SQLCLR avec le schéma suivantCorrespondance de colonne de type SqlXml dans SQLCLR à table SQL colonne Xml

- Schéma pour la table temporaire

CREATE TABLE ##temp_table_configurationXml_local (
     [OrchConfigXML] [xml] 
     ) 

Code SQLCLR:

 DataTable dt = new DataTable(tableToUse); // tableToUse is the temp table from SQL 
     dt.Columns.Add("OrchConfigXML", typeof(SqlXml)); 


     DataRow dr = dt.NewRow(); 
     dr["orchConfigXML"] = xmlToUse; // This is type of SqlXML and has valid XML in it 
     dataTableToUse.Rows.Add(dr); 

     // Write Data 
     // auto-disposable bulk copy operation 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) 
     { 
      bulkCopy.DestinationTableName = destTable; 
      bulkCopy.ColumnMappings.Add(new 
      SqlBulkCopyColumnMapping("OrchConfigXML", "OrchConfigXML")); 
      // Bulk copy operation will drain memory so it is better to setup a batchsize.      
      bulkCopy.BatchSize = 50000; 
      bulkCopy.WriteToServer(dt); 
      conn.Close(); //Close the SQL Connection. 
     } 

Pendant l'exécution du script SQL et le débogage du code SQLCLR j'obtiens une erreur en C#/SQLCLR.

The given ColumnMapping does not match up with any column in the source or destination. 

Comment mapper un type de données XML SQLXML vers SQL.

+1

Combien de colonnes contiennent 'destTable'? Si seulement 1, alors vous n'avez pas besoin de 'SqlBulkCopyColumnMapping' en premier lieu. Aussi, je ne me souviens pas, mais en utilisant les noms de colonnes pour le mapping _might_ être sensible à la casse, et vous avez "** O ** rchConfigXML" lorsque vous avez défini la colonne, mais "** o ** rchConfigXML" dans la colonne cartographie. De plus, je vois où 'dt' est créé, mais pas' dataTableToUse'. En outre, qu'essayez-vous finalement de faire, et pourquoi utilisez-vous 'SqlBulkCopy'? –

+0

Oui, il était sensible à la casse. J'ai mis à jour le nom à OrchConfigXML et maintenant j'obtiens l'erreur suivante Impossible de lancer l'objet de type 'System.Data.SqlTypes.SqlXml' pour taper 'System.String – Abe

+0

1) Il n'y a qu'une seule colonne dans destTable. 2) Le texte dans cette colonne sera XML et peut être énorme, donc en utilisant SQLBulkCopy, quelle est l'alternative à utiliser?Je suis heureux de modifier mon code 3) J'ai mis à jour mon code dans ma question, j'ai quelques méthodes mais pour la simplicité j'ai fusionné le code dans ma question. – Abe

Répondre

0

Questions:

  1. Combien de colonnes sont en destTable? Si seulement un, alors vous n'avez pas besoin SqlBulkCopyColumnMapping en premier lieu.

    (réponse: « Il n'y a qu'une seule colonne dans destTable »)

  2. Qu'est-ce que vous essayez de faire en fin de compte, et pourquoi utilisez-vous SqlBulkCopy?

  3. Combien de lignes y aura-t-il dans ##temp_table_configurationXml_local? Si seulement un, puis passer la valeur dans via SqlXml paramètre d'entrée pourrait être mieux.

  4. Est-ce que xmlToUse est ajouté, comme une autre ligne, à tout ce qui est dans ##temp_table_configurationXml_local? Cela semble être une configuration étrange et/ou alambiquée.

choses à essayer/considérer:

  1. Je ne me souviens pas, mais en utilisant les noms de colonnes pour la mise en correspondance peut-être sensible à la casse, et vous avez « O rchConfigXML » lorsque vous défini la colonne, mais "o rchConfigXML" dans le mappage de colonne. Pour la définition de colonne dans le DataTable, vous pouvez essayer d'utiliser SqlDbType.Xml au lieu de SqlXml. SqlXml est utilisé pour les paramètres d'entrée/sortie, les types de retour et les champs d'ensemble de résultats renvoyés par les objets SQLCLR.