Skip to content

Instantly share code, notes, and snippets.

@gionnani
Forked from ernado-x/ClassGenerator.sql
Last active July 24, 2019 12:03
Show Gist options
  • Save gionnani/1d52f4e63162d5da552d59bbedccecf6 to your computer and use it in GitHub Desktop.
Save gionnani/1d52f4e63162d5da552d59bbedccecf6 to your computer and use it in GitHub Desktop.
Generate C# class from database table
--modified from SO: http://stackoverflow.com/questions/5873170/generate-class-from-database-table
--added table and column
declare @TableName sysname = 'TableName'
declare @Result varchar(max) = '[Table(Name = "' + @TableName + '")]
public class ' + @TableName + '
{'
select @Result = @Result + '
[Column(DbType = "' +
Case
when ColumnDbType in ('nvarchar', 'nchar', 'varchar', 'char', 'datetime2', 'binary', 'datetimeoffset', 'time', 'varbinary') then ColumnDbType + '(' + cMlength + ')'
when ColumnDbType in ('decimal', 'numeric') then ColumnDbType + '(' + cPrecision + ',' + cScale +')'
else ColumnDbType end + '", ' + case ISPK when 'true' then 'IsPrimaryKey = true' else 'CanBeNull = ' + cNullable end +')]
public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; }
'
from
(
select distinct
replace(col.name, ' ', '_') ColumnName,
column_id ColumnId,
typ.name ColumnDbType,
convert(varchar, col.precision) cPrecision,
convert(varchar, col.scale) cScale,
convert(varchar, col.max_length) cMlength,
case col.is_nullable when 1 then 'true' else 'false' end cNullable,
pkk.ISPK,
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 'double'
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 'float'
when 'smalldatetime' then 'DateTime'
when 'smallint' then 'short'
when 'smallmoney' then 'decimal'
when 'text' then 'string'
when 'time' then 'TimeSpan'
when 'timestamp' then 'long'
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
left join
(
SELECT c.name AS 'ColumnName', CASE WHEN dd.pk IS NULL THEN 'false' ELSE 'true' END ISPK
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
LEFT JOIN (SELECT K.COLUMN_NAME , C.CONSTRAINT_TYPE as pk
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
ON K.TABLE_NAME = C.TABLE_NAME
AND K.CONSTRAINT_NAME = C.CONSTRAINT_NAME
AND K.CONSTRAINT_CATALOG = C.CONSTRAINT_CATALOG
AND K.CONSTRAINT_SCHEMA = C.CONSTRAINT_SCHEMA
WHERE K.TABLE_NAME = @TableName) as dd
ON dd.COLUMN_NAME = c.name
WHERE t.name = @TableName
) pkk on ColumnName=col.name
where object_id = object_id(@TableName)
) t
order by ColumnId
set @Result = @Result + '
}'
print @Result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment