Хитрое расширение фигурной скобки в оболочке

Если вы создаете похожую таблицу, вы можете использовать ее в двух подходах для динамического сопоставления столбцов в пакете служб SSIS, или вы должны построить весь пакет программно. В этом ответе я попытаюсь дать вам некоторое представление о том, как это сделать.

(1) Построение исходной SQL-команды с псевдонимами

Примечание. Этот подход будет работать только в том случае, если все файлы .dbf имеют одинаковое количество столбцов, но имена различаются

[ 1143]. При таком подходе вы создадите команду SQL, которая будет использоваться в качестве источника, на основе созданного вами FileID и таблицы сопоставления. Вы должны знать, что FileID и путь к файлу .dbf хранятся в переменной. как пример:

Предполагая, что именем таблицы является inputoutputMapping

Добавьте задачу «Выполнить SQL» с помощью следующей команды:

DECLARE @strQuery as VARCHAR(4000)

SET @strQuery = 'SELECT '

SELECT @strQuery = @strQuery + '[' + InputColumn + '] as [' + OutputColumn + '],'
FROM inputoutputMapping
WHERE FileID = ?

SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + CAST(? as Varchar(500))

SELECT @strQuery

И в На вкладке «Сопоставление параметров» выберите переменную, содержащую FileID, который должен быть сопоставлен с параметром 0, и переменную, содержащую имя файла .dbf (альтернативное имени таблицы) для параметра 1

. Установите ResultSet введите Single Row и сохраните ResultSet 0 внутри переменной типа string, как в примере @[User::SourceQuery]

Значение ResultSet будет следующим:

SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1

В [119 ] выберите команду «Режим доступа к таблице из SQL» из переменной и используйте переменную @[User::SourceQuery] в качестве источника.


(2) Использование компонента Script в качестве источника

В этом подходе вы должны использовать компонент Script в качестве источника в задаче потока данных:

все, вам нужно передать путь файла .dbf и соединение SQL Server с компонентом сценария через переменные, если вы не хотите жестко их кодировать.

В редакторе сценариев вы должны добавить выходной столбец для каждого столбца, найденного в таблице назначения, и сопоставить их с пунктом назначения .

Внутри скрипта вы должны прочитать файл .dbf в таблицу данных:

После загрузки данных в таблицу данных также заполните другую таблицу данных данными, найденными в таблице MappingTable, созданной вами в SQL Server.

После этого выполните цикл по столбцам с данными и измените .ColumnName на соответствующий выходной столбец, например:

foreach (DataColumn col in myTable.Columns)
    {

    col.ColumnName = MappingTable.AsEnumerable().Where(x => x.FileID = 1 && x.InputColumn = col.ColumnName).Select(y => y.OutputColumn).First(); 

    }

После цикла по каждой строке в таблице данных и создайте строку вывода сценария. [ 1156]

Кроме того, обратите внимание, что при назначении выходных строк вы должны проверить, существует ли столбец, вы можете сначала добавить все имена столбцов в список строк, а затем использовать его для проверки, например:

var columnNames = myTable.Columns.Cast()
                             .Select(x => x.ColumnName)
                             .ToList();  


foreach (DataColumn row in myTable.Rows){

if(columnNames.contains("CustCode"){

    OutputBuffer0.CustCode = row("CustCode");

}else{

    OutputBuffer0.CustCode_IsNull = True

}

//continue checking all other columns

}

[ 1158] Если вам требуется более подробная информация об использовании компонента Script в качестве источника, проверьте одну из следующих ссылок:


(3) Динамическое построение пакета

Я не думаю, что есть другие методы, которые вы можете использовать для достижения этой цели, кроме как у вас есть выбор: постройте пакет динамически, тогда вы должны выполнить:


(4) SchemaMapper: класс отображения схемы C # lib rary

Недавно я начал новый проект на Git-Hub, который является библиотекой классов, разработанной с использованием C #. Вы можете использовать его для импорта табличных данных из Excel, Word, PowerPoint, Text, CSV, HTML, JSON и XML в таблицу сервера SQL с другим определением схемы с использованием подхода сопоставления схемы. проверить это по адресу:

Вы можете перейти к этой странице вики для пошагового руководства :

8
задан Charles Stewart 11 February 2010 в 10:54
поделиться

3 ответа

... Так много неправильного в использовании eval . То, о чем вы спрашиваете, возможно только с eval , НО то, что вы хотите , легко возможно без необходимости прибегать к bash bug-central.

Используйте массивы! Всякий раз, когда вам нужно сохранить несколько элементов в одном типе данных, вам понадобится (или должен использовать) массив.

TEST=(quick man strong)
touch "${TEST[@]/%/ly}"

Это делает именно то, что вы хотите, без тысячи ошибок и проблем безопасности, представленных и скрытых в других предложениях здесь.

Это работает следующим образом:

  • "$ {foo [@]}" : расширяет массив с именем foo , расширив каждый из его элементов, правильно процитированных. Не забывайте цитаты!
  • $ {foo / a / b} : Это тип расширения параметров, который заменяет первый a в раскрытии foo на a b . В этом типе расширения вы можете использовать % для обозначения конца расширенного значения , что-то вроде $ в регулярных выражениях.
  • Поместите все это. вместе и "$ {foo [@] /% / ly}" расширит каждый элемент foo , правильно процитирует его как отдельный аргумент и заменит конец каждого элемента на ly .
18
ответ дан 5 December 2019 в 07:36
поделиться

В bash вы можете сделать следующее:

#!/bin/bash
TEST=quick,man,strong
eval echo $(echo {$TEST}ly)
#eval touch $(echo {$TEST}ly)

Эта последняя строка закомментирована, но касается указанных файлов.

3
ответ дан 5 December 2019 в 07:36
поделиться

На основе приведенных выше ответов:

$ TEST=quick,man,strong
$ touch $(eval echo {$TEST}ly)
0
ответ дан 5 December 2019 в 07:36
поделиться