2017-02-17 13 views
0

У меня есть две таблицы в моей базе данных, одна из которых называется Sales.Salesperson, которая является источником, а целевая база данных - dbo.Salesperson. Я создал BIML, который использует код C#, чтобы получить список существующих таблиц из источника, а затем импортировать все данные из источника в целевую. В моем примере у меня есть только одна таблица, которую я выше перечисл. На C# я использую SQL-соединение и команду SQL, чтобы получить таблицу и схему всех таблиц (снова только 1, чтобы она могла быть динамической),BIML и C# SQL-соединение и команда на вопрос SSIS

ПРОБЛЕМА, поскольку у меня есть период, схема sepearte и table, в моей команде SQL, когда я перехожу из BIML в Generate SSIS-пакет, он дает мне сообщение об ошибке с шага SSIS EXECUTESQL DirectInput, когда я пытаюсь обрезать таблицу < # = таблица #> ошибка говорит: «Sales.SalesPerson в пакете DynamicDataLoad включает недопустимые символы (/:[].=) для SSIS недопустимые символы будут заменены with_»И из-за этого, я получаю сообщение об ошибке на моем пакете SSIS

Вот ниже код, чтобы помочь:.

<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> 
:

и ниже - часть C#, если вы посмотрите на команду SQL, я возвращаю Schema, а затем таблицу в список, называемый «table», который используется в приведенном выше BIML, чтобы перечислить все таблицы, которые будут преобразованы в пакет SSIS, это используется в части BIML, называемой усечением, в которой ошибка возникает из 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

Я не совсем понимаю, в чем проблема. Не могли бы вы сделать минутку и нажать кнопку «Изменить», чтобы уточнить вопрос? Возможно, покажите некоторые из кода, который вы используете. – billinkc

+0

Пожалуйста, поделитесь примером кода, где это происходит не так. –

+0

На самом деле совершенно невозможно помочь без кода примера. – bc004346

ответ

0

Ошибка генерируется <ExecuteSQL Name="Truncate Table Dest <#=table#>" ConnectionName="Target"> и <Dataflow Name="Load Table <#=table#>" > Поскольку переменная таблица будет в виде schema.table, название вашего потока данных будет что-то вроде «Dataflow foo.bar», который, если вы пытались тип вручную, SSDT не будет указывать, что вы не можете назвать его как таковой.

Решение этой конкретной проблемы, чтобы сделать что-то вроде «безопасной» строки. Подход с низкой арендной платой будет просто применять призыв «Заменить» для замены подчёркивания на период.

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

Большей проблемой будут таблицы или схемы с недопустимыми символами в них или пробелами. Это потребует, чтобы вы завернули их в []. Вместо того, чтобы слепо их применения, я бы толкать эту работу к SQL Server с QUOTENAME()

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

Я обнаружил, что я, как правило, лучше обслужены, имея схему и имя таблицы служили обратно в виде отдельных деталей, так как я считаю, конкатенация гораздо проще, чем расщепление. Это делает подпись вашей GetTables() другой. Может быть, List<KeyValuePair<string, string>>, я не знаю.

Даже тогда вы все еще делаете больше работы, чем я хотел бы сделать, когда нативный способ Biml составляет около 4 строк кода. У меня есть пример, где я использовал Biml для reverse engineer a specific schema базы данных, но поиск по Biml + GetDatabaseSchema даст вам множество примеров того, как это сделать.

+0

Привет большое спасибо за вашу помощь, к сожалению, я сделал именно то, что вы сказали то же сообщение об ошибке, не может найти таблицу «SELECT * FROM dbo.Orders» недействительный объект dbo.orders, человеку это сложно: (но большое спасибо за сообщение, прочитав его сейчас, приятно иметь другую перспективу на BIML, любые другие помощь будет большой :) – SteveB