如何检测 SELECT 中的列是否可以为空?
How to detect if column in SELECT can be null?
我在设计时使用 DacFx 创建一个从 SSDT 数据库项目中的 sql 文件生成的 C# 数据层。查看我的 SqlSharpener project on Github 以了解我在说什么。
我正在生成代表从存储过程的 SELECT 语句返回的行的 DTO 对象。为了确定 DTO 上的 属性 是否应该是可以为空的值类型,我正在检查该列在它来自的 table 中是否可以为空。如果您对它的外观感到好奇,请查看代码。 (这里的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);
问题是我没有考虑左外连接或右外连接,这也可能使值变为空。
如何确定 SELECT 语句中的列是否可以为空?或者,如果这个问题太宽泛,我如何确定该列是否来自左外连接的 table?
我想我找到了答案。给定 SELECT 语句的 QuerySpecification,我可以使用以下方法获取连接列表:
var joins = querySpecification.FromClause.TableReferences.OfType<QualifiedJoin>();
每个 QualifiedJoin 对象都有一个 QualifiedJoinType 属性,它是一个枚举,将被设置为 Inner、LeftOuter、RightOuter 或 FullOuter。
我在设计时使用 DacFx 创建一个从 SSDT 数据库项目中的 sql 文件生成的 C# 数据层。查看我的 SqlSharpener project on Github 以了解我在说什么。
我正在生成代表从存储过程的 SELECT 语句返回的行的 DTO 对象。为了确定 DTO 上的 属性 是否应该是可以为空的值类型,我正在检查该列在它来自的 table 中是否可以为空。如果您对它的外观感到好奇,请查看代码。 (这里的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);
问题是我没有考虑左外连接或右外连接,这也可能使值变为空。
如何确定 SELECT 语句中的列是否可以为空?或者,如果这个问题太宽泛,我如何确定该列是否来自左外连接的 table?
我想我找到了答案。给定 SELECT 语句的 QuerySpecification,我可以使用以下方法获取连接列表:
var joins = querySpecification.FromClause.TableReferences.OfType<QualifiedJoin>();
每个 QualifiedJoin 对象都有一个 QualifiedJoinType 属性,它是一个枚举,将被设置为 Inner、LeftOuter、RightOuter 或 FullOuter。