在BIML变量中使用CDATA时是否可以保留换行符?

时间:2018-07-18 17:06:15

标签: biml

我在BIML模板中要使用的变量中有一些SQL。 (本来我是从C#变量获取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 AS 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

1 个答案:

答案 0 :(得分: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>