BIML 中的嵌套查询

Posted

技术标签:

【中文标题】BIML 中的嵌套查询【英文标题】:Nested queries in BIML 【发布时间】:2021-07-18 00:43:58 【问题描述】:

我正在尝试 BIML,这条路充满了反复试验。

我必须从固定长度的平面文件传输数据,并将我的文件和字段的元数据存储在两个 SQL Server 表中:SourceTable 和 SourceColumn。所以我尝试了以下方法来为我的字段生成元数据:

<Tables>
<# Dim dtTables as DataTable = ExternalDataAccess.GetDataTable(staging.ConnectionString, "SELECT TableName FROM SourceTable")
for each dr as datarow In dtTables.Rows#>
<Table Name="<#= dr.item(0)#>" SchemaName="myDatabase.mySchema">
<Columns>
<# Dim dtColumns as DataTable = ExternalDataAccess.GetDataTable(staging.ConnectionString,"SELECT ColumnName FROM SourceColumn WHERE TableName = '+<#=dr.item(0)#>+'")
for each drColumn as datarow in dtColumns.Rows#>
<Column Name="<#= drColumn.Item(0) #>"></Column>
<#next#>
</Columns>
</Table>
<#next#>
</Tables>

当然,BIML 不希望我在第二个查询中间连接&lt;#=dr.item(0)#&gt;(表名)。

有没有办法做到这一点?

谢谢!

西蒙。

【问题讨论】:

我意识到我的问题更多是关于将块嵌入另一个块中,这似乎是不可能的。不过,解决方法是什么? 【参考方案1】:

当您在 &lt;# 中时,您处于“正常”编码空间,因此您可以访问任何可用的变量

改变

Dim dtColumns as DataTable = ExternalDataAccess.GetDataTable(staging.ConnectionString,"SELECT ColumnName FROM SourceColumn WHERE TableName = '+<#=dr.item(0)#>+'")

Dim dtColumns as DataTable = ExternalDataAccess.GetDataTable(staging.ConnectionString,"SELECT ColumnName FROM SourceColumn WHERE TableName = '" & dr.item(0) & "'")

对未来的评论者来说是的,如果有人在您的表中添加 sql 注入,这可能会有风险,但如果发生这种情况,您已经拥有了。

【讨论】:

我有点生疏了,所以我觉得我犯了一个愚蠢的错误。谢谢你又来救我了!

以上是关于BIML 中的嵌套查询的主要内容,如果未能解决你的问题,请参考以下文章

数据库系统原理作业七数据查询中的嵌套查询

Arel 中的嵌套查询

查询嵌套查询结果中的两列

oracle嵌套where查询

如何使用深度嵌套查询处理 Vue Apollo 中的删除?

H2:使用嵌套查询的计数查询中的列名重复