如何检测SELECT中的列是否为空?

时间:2015-05-14 14:11:58

标签: c# sql-server sql-server-data-tools dac scriptdom

我在设计时使用DacFx创建一个C#数据层,该数据层是从SSDT数据库项目中的sql文件生成的。请参阅我的SqlSharpener project on Github,看看我在说什么。

我正在生成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。

如何判断SELECT语句中的列是否为空?或者,如果该问题过于宽泛,我如何确定该列是否来自外部连接的表?

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。鉴于SELECT语句的QuerySpecification,我可以使用:

获取连接列表
<div ng="$last" somedirective datajson=mydata myprop="{{ mydata.myspecialprop }}"></div>

每个QualifiedJoin对象都有一个QualifiedJoinType属性,该属性是一个枚举,将设置为Inner,LeftOuter,RightOuter或FullOuter。