我有简单的查询代码来生成动态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内置参数的解决方案,但是如果不可能,则某些正则表达式或后期模型填充也可能适用,实际上,我愿意接受任何能够满足需求的解决方案。 / p>
尝试了几件事,包括“ 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”上仍然存在错误,以某种方式我需要使引号覆盖所有列,而不仅仅是带空格的列...
答案 0 :(得分:1)
SqlQueryBuilder类的Formats
属性具有QuoteColumnAlias
选项。启用它以使SqlQueryBuilder在引号(或方括号)中采用列别名。
builder.Formats.QuoteColumnAlias = true;
build.BuildSQL();
. . . . .
答案 1 :(得分:0)
@Sergiy的评论非常有帮助,我想出了一种在加载模型后进行处理的方法:
foreach (var column in EasyQueryCachedObject.Columns)
{
if (column.Expr.GetType() == typeof(DbEntityAttrExpr))
{
((DbEntityAttrExpr)column.Expr).Attribute.Quote = true;
}
}
似乎可以正常工作,所有列均已正确包装,并且查询执行无误。