如何检测选择中的列是否可以为null



我在设计时使用DACFX来创建从SSDT数据库项目中SQL文件生成的C#数据层。在Github上查看我的SQLSharpener项目,以了解我在说什么。

我正在生成DTO对象,该对象表示从存储过程的Select语句返回的一行。为了确定DTO上的属性是否应该是可确定的值类型,我要检查以查看该列是否可在其来自的表中进行无效。如果您很好奇,这是代码。(tsqlobject这是存储过程的TSqlObject的实例)

var bodyColumnTypes = tSqlObject.GetReferenced(dac.Procedure.BodyDependencies)
    .Where(x => x.ObjectType.Name == "Column")
    .GroupBy(bd => string.Join(".", bd.Name.Parts))
    .Select(grp => grp.First())
    .ToDictionary(
        key => string.Join(".", key.Name.Parts),
        val => new DataType
        {
            Map = DataTypeHelper.Instance.GetMap(TypeFormat.SqlServerDbType, val.GetReferenced(dac.Column.DataType).First().Name.Parts.Last()),
            Nullable = dac.Column.Nullable.GetValue<bool>(val)
        },
        StringComparer.InvariantCultureIgnoreCase);

问题是我没有考虑左或右外连接,这也可能使值无效。

如何确定选择语句中的列是否可以为null?或者,如果这个问题太广泛,我该如何确定列是否来自外部连接的表格?

我想我找到了答案。给定选择语句的查询指定,我可以使用以下方式获得加入列表:

var joins = querySpecification.FromClause.TableReferences.OfType<QualifiedJoin>();

每个合格的join对象都有一个合格的jointype属性,该属性将设置为内部,左,右路或fullouter。

最新更新