Как смешать С# с BIML?

У меня есть файл BIML, включая сценарии С# для получения строки sql с сервера SQL, и параметр проекта BIML, который может настроить строку sql, закодированную, как показано ниже:

<Projects>
    <PackageProject Name="ProjectSSIS60">
      <Parameters>
        <Parameter Name="pTenantKey" Id="{3f8e0fe6-e8c4-4a6a-8fb3-ddf6bbeb63a6}" DataType="Int16">123</Parameter>
      </Parameters>
    </PackageProject>
</Projects>

<Packages>
    <#
    foreach(DataRow row in AllTables.Rows)
    {
        SqlSource = row["SqlSource"].ToString();
    #>
        <Package Name="LoadDim" ConstraintMode="Linear">
            <Tasks>
                <Dataflow Name="Dim">
                    <Transformations>
                        <OleDbSource ConnectionName="pConnectionOLTP" Name="SRC Dim">
                            <DirectInput><#=SqlSource.Replace("@[$Project::pTenantKey]", ProjectSSIS60::pTenantKey)#></DirectInput>
                        </OleDbSource>

... ...

я хочу использовать

<#=SqlSource.Replace("@[$Project::pTenantKey]", ProjectSSIS60::pTenantKey)#>

чтобы заменить ключевое слово @[$Project::pTenantKey] внутри возвращаемой строки sql параметром проекта ProjectSSIS60::pTenantKey.

Однако сообщение об ошибке показывает, что

Псевдоним ProjectSSIS60 не найден

. Как я могу сослаться на параметр проекта в строке С#, пожалуйста? Заранее спасибо!


person Yan Zhao    schedule 31.01.2018    source источник
comment
Если я удалю область проекта, то есть изменю ProjectSSIS60::pTenantKey только на pTenantKey, ошибка будет прочитана как: Имя «pTenantKey» не существует в текущем контексте   -  person Yan Zhao    schedule 31.01.2018
comment
Файлы BIML имеют формат XML, поэтому вы можете использовать методы XML.   -  person jdweng    schedule 31.01.2018


Ответы (1)


Я думаю, что проблема, с которой вы сталкиваетесь, двояка.

Во-первых, вы объявили параметр проекта в рамках текущего уровня Biml и поэтому пока не можете ссылаться на него.

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

Вместо этого я считаю, что ваш SqlSource выглядит примерно так:

SELECT * 
FROM dbo.MyTable AS T
WHERE T.TenantKey = @[$Project::pTenantKey]

Если это так, вы перепутали типы параметризации - это легко сделать.

Вы указали, что это источник OLEDB, поэтому вы будете использовать систему на основе нулевого порядкового номера с ? в качестве заполнителя/маркера. Приведенная выше строка должна стать

SELECT * 
FROM dbo.MyTable AS T
WHERE T.TenantKey = ?

Затем вы измените OleDbSource, чтобы иметь раздел <Parameters>, и он будет выглядеть примерно так:

<Parameters>
    <Parameter Name="0" VariableName="@[$Project::pTenantKey]" />
</Parameters>

Пока заполнитель находится либо в предложении SELECT, либо в предложении WHERE, это должно работать.

Однако вы не можете параметризовать исходную таблицу, например FROM dbo.?. Если вам нужен такой динамизм, вам нужно использовать переменную SSIS для хранения исходного запроса и применить к нему выражение, чтобы вручную заменить токен текущим значением. параметра проекта.

person billinkc    schedule 31.01.2018
comment
Спасибо за подробный ответ, мне он понятен. Однако моя проблема с использованием метода вопросительного знака заключается в том, что мой проект должен обрабатывать несколько пакетов с разными строками SqlSource для каждого. В этом случае я не всегда могу иметь ограничивающий параметр ‹Parameter Name=0 VariableName=@[$Project::pTenantKey] /› Потому что некоторым пакетам этот параметр не нужен в OleDBSource, а другим он может быть после нескольких других параметров. Поэтому я надеюсь заменить возвращенный SqlSource ключевыми словами, соответствующими определенным параметрам проекта. - person Yan Zhao; 01.02.2018