Можно ли сохранить новые строки при использовании CDATA в переменных BIML?

У меня есть SQL в переменной, которую я хочу использовать в шаблоне BIML. (Первоначально я получал SQL из переменной С#, но это не кажется важным) Я использую BIML следующим образом:

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection Name="Source" ConnectionString="Provider=SQLNCLI11;Data Source=localhost\dev2017;Integrated Security=SSPI;Initial Catalog=tempdb;" />
    </Connections>
    <Packages>
        <Package Name="SO_51407483" ConstraintMode="Linear">
            <Variables>
                <Variable Name="querySql" DataType="String" IncludeInDebugDump="Exclude" EvaluateAsExpression="true">
                  <![CDATA["SELECT --This is a comment
1 AS Col1"]]>
                </Variable>
            </Variables>
            <Tasks>
                <Dataflow Name="DFT Demo">
                    <Transformations>
                        <OleDbSource Name="OLESRC query" ConnectionName="Source">
                            <VariableInput VariableName="User.querySql" />
                        </OleDbSource>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>

Моя проблема заключается в том, что при компиляции файла разрывы строк в querySql кажутся удаленными, но только на этапе проверки компиляции. Это означает, что все, что следует за первым комментарием в querySql, становится частью комментария, и проверка BIML завершается ошибкой.

Сообщение об ошибке:

Запрос узла OLESRC: не удалось выполнить запрос к источнику подключения:

SELECT --Это комментарий1 КАК Col1

Неверный синтаксис рядом с 'SELECT'

Если я изменю querySql, чтобы использовать стиль комментария /* */, проверка пройдет успешно. Если я затем открою сгенерированный файл dtsx и посмотрю переменную в SSIS, разрывы строк снова появятся.

Есть ли способ обойти это без использования /* */ везде?

Эксперименты

Это не компилируется:

<Variable Name="querySql" DataType="String" IncludeInDebugDump="Exclude" EvaluateAsExpression="true">
    "SELECT --This is a comment
1 AS Col1"
</Variable>

Это компилируется, и результирующая переменная dtsx заканчивается одним разрывом строки.

<Variable Name="querySql" DataType="String" IncludeInDebugDump="Exclude" EvaluateAsExpression="true">
    "SELECT /*This is a comment*/
1 AS Col1"
</Variable>

Это компилируется, и результирующая переменная dtsx заканчивается двумя разрывами строк.

<Variable Name="querySql" DataType="String" IncludeInDebugDump="Exclude" EvaluateAsExpression="true">
    "SELECT --This is a comment&#xD;&#xA;
1 AS Col1"
</Variable>

Я поднял этот вопрос с Variagence: https://github.com/varigence/BimlPit/issues/ 82


person Dan    schedule 18.07.2018    source источник
comment
В моей репродукции использовался BimlExpress. Расширенный Biml содержал crlf. Выпущенный пакет SSIS также сохраняется. Испытываете ли вы другое поведение?   -  person billinkc    schedule 20.07.2018
comment
Да, я получаю сообщение об ошибке компиляции, когда компилятор пытается проверить правильность SQL. Я уезжаю на несколько дней, но когда вернусь, постараюсь сократить свой кейс до минимума.   -  person Dan    schedule 21.07.2018
comment
Когда вы вернетесь, в пункте меню BimlExpress используйте Abount BimlExpress и какую версию/сборку вы используете? У меня есть Varigence BimlExpress 5.0 (32-разрядная версия) Build 5.0.62720.0, которая является новой на начало июля 2018 года.   -  person billinkc    schedule 23.07.2018
comment
Моя версия: Varigence BimlExpress 5.0 (32-разрядная версия) Сборка 5.0.63025.0 Функции и пакеты: Нет авторизованных функций или пакетов Плагины: Плагины не загружены   -  person Dan    schedule 08.08.2018
comment
@billinkc Так что я больше не могу получить первоначальный сбой. Скорее всего, я изначально неправильно написал вопрос. Однако новый полный файл, приведенный выше, не может быть скомпилирован таким же образом.   -  person Dan    schedule 09.08.2018
comment
Я считаю, что это связано с тем, что вы сохраняете свой SQL-скрипт как переменную, которая удаляет символы newline, а не сам Biml. Если вы используете переменные, вам придется использовать синтаксис /*...*/ в качестве обходного пути.   -  person iamdave    schedule 17.08.2018
comment
@iamdave Привет, я не уверен, что понимаю. Насколько я могу судить, переменные SSIS не удаляют разрывы строк.   -  person Dan    schedule 20.08.2018


Ответы (1)


В качестве минимального воспроизведения я сохраняю возврат каретки/перевод строки.

Я объявляю свою переменную запроса, а затем использую ее как в задаче «Выполнение SQL», так и в источнике OLEDB потока данных.

Задача «Выполнение SQL» не выглядит так, как будто она сохраняет CR/LF, пока вы не нажмете многоточие, но затем всплывающее окно правильно отобразит код.

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<#
string query = @"--This is a comment
SELECT 1 AS Col1";
#>
    <Connections>
        <OleDbConnection Name="Source" ConnectionString="Provider=SQLNCLI11;Data Source=localhost\dev2017;Integrated Security=SSPI;Initial Catalog=tempdb;" />
    </Connections>
    <Packages>
        <Package Name="SO_51407483" ConstraintMode="Linear">
            <Tasks>
                <ExecuteSQL Name="SQL Test Task" ConnectionName="Source">
                    <DirectInput><![CDATA[<#=query#>]]></DirectInput>
                </ExecuteSQL>
                <Dataflow Name="DFT Demo">
                    <Transformations>
                        <OleDbSource Name="OLESRC query" ConnectionName="Source">
                            <DirectInput><![CDATA[<#=query#>]]></DirectInput>
                        </OleDbSource>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>
person billinkc    schedule 19.07.2018
comment
Спасибо за ответы. Я думаю, что, возможно, я был неясен в своем вопросе. Я обновил его с более подробной информацией. - person Dan; 19.07.2018