2017-02-17 2 views
0

J'ai 2 tables sur ma base de données, une appelée Sales.Salesperson qui est la source, et la base de données cible est dbo.Salesperson. J'ai fait un BIML qui utilise le code C# pour obtenir une liste des tables existantes de la source, puis importer toutes les données de la source à la cible, pour mon exemple, j'ai juste la table 1, que j'ai listée ci-dessus. Sur le C#, j'utilise la connexion SQL et la commande SQL pour obtenir la table et le schéma de toutes les tables (encore une fois pour qu'il puisse être dynamique),Connexion BIML et C# SQL et commande vers le numéro SSIS

LE PROBLÈME, parce que j'ai un point, pour séparer le schéma et table, dans mon SQLcommand, quand je vais de BIML à Générer SSIS paquet, il me donne un message d'erreur de SSIS étape EXECUTESQL DirectInput, quand je tente de tronquer la table < # = table #> erreur dit "Sales.SalesPerson dans le package DynamicDataLoad comprend des caractères non valides (/:[].=) pour SSIS les caractères non valides seront remplacés with_ » et de ce fait, je reçois une erreur sur mon package SSIS

Voici le code ci-dessous pour aider.

<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <Packages> 
     <Package Name="DynamicDataLoad" ConstraintMode ="Linear"   ProtectionLevel="DontSaveSensitive"> 
     <Tasks> 
      <# foreach(var table in GetTables()) { #> 
      <ExecuteSQL Name="Truncate Table Dest <#=table#>" ConnectionName="Target"> 
       **<DirectInput>Truncate Table <#=table#></DirectInput>   
      </ExecuteSQL>** 
      <Dataflow Name="Load Table <#=table#>" > 
       <Transformations> 
        <OleDbSource Name="Source Table" ConnectionName="Source"> 
         <ExternalTableInput Table="<#=table#>" /> 
        </OleDbSource> 
        <OleDbDestination Name="Destination Table" ConnectionName="Target"> 
         <ExternalTableOutput Table="<#=table#>" /> 
        </OleDbDestination> 
       </Transformations> 
      </Dataflow> 
      <# } #> 
     </Tasks> 
    </Package> 
</Packages> 
</Biml> 

et ci-dessous est la partie C#, si vous regardez la commande SQL, je ramène schéma puis table dans une liste appelée "table, qui est utilisé dans le BIML ci-dessus pour lister toutes les tables à convertir en package SSIS, ceci est utilisé dans la partie BIML appelée truncation, qui est l'origine de l'erreur dans le BIML.

<#+ 
List<string> GetTables() { 
    List<string> tables = new List<string>(); 

     SqlConnection cn = new SqlConnection("Data Source=mdsdqsdev;Initial Catalog=Test;Persist Security Info=False;Integrated Security=SSPI;"); 
     SqlDataAdapter da = new SqlDataAdapter(); 
     DataSet ds = new DataSet(); 
     DataTable dt = new DataTable(); 

     string q = "Select TABLE_SCHEMA+'.'+TABLE_NAME as name from INFORMATION_SCHEMA.TABLES"; 

     var cmd = new SqlCommand(q); 
     cmd.Connection = cn; 

    try 
    { 
      da.SelectCommand = cmd; 

      ds.Tables.Add(new DataTable("Results")); 

      if(cn.State != ConnectionState.Open) 
      { 
       cn.Open(); 
      } 

      ds.Tables[0].BeginLoadData(); 
      da.Fill(ds,"Results"); 
      ds.Tables[0].EndLoadData(); 

      dt = ds.Tables[0]; 

      if(cn.State != ConnectionState.Closed) 
      { 
       cn.Close(); 
      } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     if (cn.State != ConnectionState.Closed) 
     { 
      cn.Close(); 
     } 
     cn.Dispose(); 
    } 

    foreach (DataRow row in dt.Rows) 
    { 
     tables.Add(row["name"].ToString()); 
    } 

    return tables; 
} 

#> 
+1

Je ne suis pas tout à fait le suivi de ce problème. Pourriez-vous prendre un moment et cliquer sur le bouton d'édition pour clarifier la question? Peut-être montrer une partie du code que vous utilisez – billinkc

+0

S'il vous plaît partager un échantillon du code où cela va mal –

+0

Vraiment tout à fait impossible d'aider sans exemple de code. – bc004346

Répondre

0

L'erreur est générée par <ExecuteSQL Name="Truncate Table Dest <#=table#>" ConnectionName="Target"> et <Dataflow Name="Load Table <#=table#>" > Étant donné que votre variable de table sera sous forme de schema.table, le nom de votre flux de données serait quelque chose comme « Dataflow Foo.Bar » qui, si vous avez essayé de tapez manuellement, SSDT rechignerait en spécifiant que vous ne pouvez pas le nommer en tant que tel.

La résolution de ce problème spécifique à faire quelque chose comme "sûr" de la chaîne. Une approche à faible loyer serait simplement appliquer un appel Remplacer pour échanger un trait de soulignement pour la période.

<ExecuteSQL Name="Truncate Table Dest <#=table.Replace(".", "_")#>" ConnectionName="Target"> 

Un problème plus important sera de tableaux ou de schémas qui ont des caractères non valides dans les espaces ou. Cela vous obligerait à les emballer avec []. Au lieu de les appliquer aveuglément, je pousserais que le travail à SQL Server avec QUOTENAME()

Select QUOTENAME(TABLE_SCHEMA) +'.' + QUOTENAME(TABLE_NAME) as name 

J'ai trouvé que je suis généralement mieux servi en ayant le schéma et le nom de la table ont servi de retour en tant que parties discrètes, que je trouve concaténation beaucoup plus facile que la division. Cela rend la signature de votre GetTables() différente. Peut-être List<KeyValuePair<string, string>>, je ne sais pas.

Même alors, vous faites encore plus de travail que ce que je voudrais faire quand le mode natif de Biml est d'environ 4 lignes de code. J'ai un exemple où j'ai utilisé Biml à reverse engineer a specific schema d'une base de données mais la recherche sur Biml + GetDatabaseSchema vous donnera de nombreux exemples de comment faire.

+0

Hey Grand merci pour votre aide, malheureusement, j'ai fait exactement ce que vous avez dit le même message d'erreur, ne pouvait pas trouver la table "SELECT * FROM dbo.Orders" objet invalide dbo.orders, l'homme c'est dur :(mais grand merci pour votre poste, en le lisant maintenant, agréable d'avoir une autre perspective sur BIML, tout autre l'aide serait géniale :) – SteveB