从用户定义的表类型SQL生成C#类

时间:2017-09-19 16:41:46

标签: c# sql sql-server

我需要生成遵循SQL Server用户定义类型的C#类规范的字符串。

我有这个代码,我从一个不同的堆栈溢出答案得到了我想要的东西,并从SQL Server表生成一个C#类。我想修改它,以便它从SQL Server用户定义的表类型生成类似的类。

declare @TableName sysname = 'YOURTABLENAME'
declare @Result varchar(max) = 'public class ' + @TableName + '
{'

select @Result = @Result + '
    public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; }'
from
(
    select 
        replace(col.name, ' ', '_') ColumnName,
        column_id ColumnId,
        case typ.name 
            when 'bigint' then 'long'
            when 'binary' then 'byte[]'
            when 'bit' then 'bool'
            when 'char' then 'string'
            when 'date' then 'DateTime'
            when 'datetime' then 'DateTime'
            when 'datetime2' then 'DateTime'
            when 'datetimeoffset' then 'DateTimeOffset'
            when 'decimal' then 'decimal'
            when 'float' then 'float'
            when 'image' then 'byte[]'
            when 'int' then 'int'
            when 'money' then 'decimal'
            when 'nchar' then 'string'
            when 'ntext' then 'string'
            when 'numeric' then 'decimal'
            when 'nvarchar' then 'string'
            when 'real' then 'double'
            when 'smalldatetime' then 'DateTime'
            when 'smallint' then 'short'
            when 'smallmoney' then 'decimal'
            when 'text' then 'string'
            when 'time' then 'TimeSpan'
            when 'timestamp' then 'DateTime'
            when 'tinyint' then 'byte'
            when 'uniqueidentifier' then 'Guid'
            when 'varbinary' then 'byte[]'
            when 'varchar' then 'string'
            else 'UNKNOWN_' + typ.name
        end ColumnType,
        case 
            when col.is_nullable = 1 and typ.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier') 
            then '?' 
            else '' 
        end NullableSign
    from sys.columns col
        join sys.types typ on
            col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
    where object_id = object_id(@TableName)
) t
order by ColumnId

set @Result = @Result  + '
}'

print @Result

我尝试修改select语句以根据用户定义的表类型返回字符串。但是,这只会返回ModifiedBy

from 
    sys.table_types as tt
inner join 
    sys.columns as col on tt.type_table_object_id = col.object_id
join 
    sys.types typ on col.system_type_id = typ.system_type_id 
                  and col.user_type_id = typ.user_type_id
where 
    tt.name = @TableName

1 个答案:

答案 0 :(得分:0)

以下SQL脚本应该可以解决问题

declare @TypeName sysname = 'VehicleActivity_Raw'
declare @Result varchar(max) = 'public class ' + @TypeName + '
{'

select @Result = @Result + '
	public ' + ColumnType + NullableSign + ' ' + ColumnName + ' {get; set;}'
	FROM (
		Select 
			column_id,
			replace(c.name, ' ', '_') ColumnName,
				case y.name 
					when 'bigint' then 'long'
					when 'binary' then 'byte[]'
					when 'bit' then 'bool'
					when 'char' then 'string'
					when 'date' then 'DateTime'
					when 'datetime' then 'DateTime'
					when 'datetime2' then 'DateTime'
					when 'datetimeoffset' then 'DateTimeOffset'
					when 'decimal' then 'decimal'
					when 'float' then 'float'
					when 'image' then 'byte[]'
					when 'int' then 'int'
					when 'money' then 'decimal'
					when 'nchar' then 'string'
					when 'ntext' then 'string'
					when 'numeric' then 'decimal'
					when 'nvarchar' then 'string'
					when 'real' then 'double'
					when 'smalldatetime' then 'DateTime'
					when 'smallint' then 'short'
					when 'smallmoney' then 'decimal'
					when 'text' then 'string'
					when 'time' then 'TimeSpan'
					when 'timestamp' then 'DateTime'
					when 'tinyint' then 'byte'
					when 'uniqueidentifier' then 'Guid'
					when 'varbinary' then 'byte[]'
					when 'varchar' then 'string'
					when 'sysname' then 'string'
					else 'UNKNOWN_' + y.name
				end ColumnType,
				case 
					when c.is_nullable = 1 and y.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier') 
					then '?' 
					else '' 
				end NullableSign
		From sys.table_types t
		Inner join sys.columns c on c.object_id = t.type_table_object_id
		Inner join sys.types y ON y.system_type_id = c.system_type_id
		WHERE t.is_user_defined = 1
		  AND t.is_table_type = 1
		  AND t.name = @TypeName
	) AS C
	ORDER BY column_id

set @Result = @Result  + '
}'

print @Result