Microsoft.SqlServer.Management.Smo - 如何将列数据类型转换为 sql 表示

Posted

技术标签:

【中文标题】Microsoft.SqlServer.Management.Smo - 如何将列数据类型转换为 sql 表示【英文标题】:Microsoft.SqlServer.Management.Smo - how to convert a column data type to sql represenation 【发布时间】:2020-03-05 19:06:48 【问题描述】:

如果我正在使用 SQL Server 管理对象,并且我有一个列对象的实例,并且我想从中生成一个 T-SQL 脚本,我如何最好地将列数据类型转换为它应该如何表示在 SQL 中?

Column class 具有以下属性:

SQL Server 数据类型(VarChar、VarBinary、XML 等) 数值精度 数值刻度 精确 最大长度 IsNumericType IsStringType

我发现查看属性并为 T-SQL 脚本呈现正确的文本有点挑战性。 DateTimeOffsetDateTimeFloatInt 就是很好的例子。它们都有精度、比例和最大长度值,但渲染数据类型的格式完全不同。

SMO 库中是否有一个函数可以对我执行此操作?

例子:

Type IsNumericType IsStringType Precision Scale MaxLength 渲染结果 bigint 真假 19 0 8 BigInt 位 FALSE FALSE 1 0 1 位 字符 FALSE TRUE 0 0 10 字符 (10) 日期时间 FALSE FALSE 23 3 8 日期时间 datetimeoffset FALSE FALSE 34 7 10 DateTimeOffset(7) 十进制 TRUE FALSE 10 3 9 十进制 (10,3) 浮动 TRUE FALSE 53 0 8 浮动 整数 真 假 10 0 4 整数 唯一标识符 FALSE FALSE 0 0 16 唯一标识符 varchar FALSE TRUE 0 0 10 VarChar(10) varchar FALSE TRUE 0 0 -1 VarChar(MAX) varbinary FALSE FALSE 0 0 10 VarBinary(10) varbinary FALSE FALSE 0 0 -1 VarBinary(MAX) xml 错误 错误 0 0 -1 XML

【问题讨论】:

Column.DataType.SqlDataType 不足以满足您的要求吗? docs.microsoft.com/en-us/dotnet/api/… 不,那纯粹是一个枚举,所以它不表示长度、比例、精度等。 【参考方案1】:

SMO 库中有一个函数可以做到这一点,不幸的是它不是公共方法。

因此,最简单的方法是通过反射来实现:

var getTypeDefinitionScriptMethod = typeof(UserDefinedDataType).GetMethod("GetTypeDefinitionScript", BindingFlags.Static | BindingFlags.NonPublic);
var declaration = getTypeDefinitionScriptMethod.Invoke(null, new object[] new ScriptMaker().Preferences, column, "DataType", false) as string;

此代码后的“声明”的值将是完整的数据类型,例如“nvarchar(max)”、“decimal(18,0)”、“int”等。

【讨论】:

以上是关于Microsoft.SqlServer.Management.Smo - 如何将列数据类型转换为 sql 表示的主要内容,如果未能解决你的问题,请参考以下文章