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 脚本呈现正确的文本有点挑战性。 DateTimeOffset
、DateTime
、Float
和 Int
就是很好的例子。它们都有精度、比例和最大长度值,但渲染数据类型的格式完全不同。
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 表示的主要内容,如果未能解决你的问题,请参考以下文章