1

我有生成动态 SQL 语句的简单查询代码:

//Model is loaded with "model.LoadFromConnection"
var EasyQueryCachedObject = new DbQuery();
EasyQueryCachedObject.Model = model; //Specified before
EasyQueryCachedObject.Model.Description = "XXX";
EasyQueryCachedObject.Formats.SetDefaultFormats(FormatType.MsSqlServer);

... //More logic to form query

var builder = new SqlQueryBuilder(EasyQueryCachedObject);

if (builder.CanBuild)
{
    builder.BuildSQL();
    var SQLQuery = builder.Result.SQL;
    var QueryXML = builder.Result.Query.SaveToString();
}

问题是我正在查询生成如下 SQL 的表:

SELECT Entry No 
    ,Item No 
    ,Open
FROM.[dbo].[DataImport_2013]

这失败了,因为列名包含保留字/空格,我怎样才能让 EasyQuery 用方括号括起所有列,如下所示?

SELECT [Entry No ]
    ,[Item No ]
    ,[Open]
FROM.[dbo].[DataImport_2013]

显然,使用 EasyQuery 的内置参数的解决方案将是首选,但如果这不可能,也许某种正则表达式或后模型填充也可以工作,我真的愿意接受任何可以满足需求的解决方案。

更新 1

尝试了几件事,包括“QuoteColumnAlias”,生成的查询类似于以下内容:

SELECT DataImport_2018."Entry No " AS "DataImport_2018 Entry No", 
    DataImport_2018."Item No " AS "DataImport_2018 Item No", 
    DataImport_2018.Open AS "DataImport_2018 Open" 
FROM dbo.DataImport_2018 AS DataImport_2018

保留词“open”仍然存在错误,不知何故我需要让引号覆盖所有列,而不仅仅是带空格的...

4

2 回答 2

1

SqlQueryBuilder 类的Formats属性包含QuoteColumnAlias选项。打开它以使 SqlQueryBuilder 采用引号(或括号)中的列别名。

builder.Formats.QuoteColumnAlias = true;
build.BuildSQL();
.   .   .   .   .
于 2018-08-21T06:09:36.747 回答
0

@Sergiy 评论非常有帮助,我想出了一种在加载模型后执行此操作的方法:

foreach (var column in EasyQueryCachedObject.Columns)
{
    if (column.Expr.GetType() == typeof(DbEntityAttrExpr))
    {
        ((DbEntityAttrExpr)column.Expr).Attribute.Quote = true;
    }
}

似乎工作,所有列都正确包装,查询执行没有错误。

于 2018-08-22T22:09:27.037 回答