Skip to content

Instantly share code, notes, and snippets.

@richorama
Last active November 6, 2018 19:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save richorama/c748aeb2cd0ce8bbd0c91cc14d20e4de to your computer and use it in GitHub Desktop.
Save richorama/c748aeb2cd0ce8bbd0c91cc14d20e4de to your computer and use it in GitHub Desktop.
Sql script to create C# classes from a database schema
declare @Result varchar(max)
declare @TableName varchar(256)
DECLARE table_cursor CURSOR
FOR Select name from sysobjects where xtype = 'U' -- or 'V'
OPEN table_cursor
FETCH NEXT FROM table_cursor
INTO @TableName
while @@FETCH_STATUS = 0
begin
set @Result = 'public partial 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 'Int64'
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 'byte[]'
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
FETCH NEXT FROM table_cursor
INTO @TableName
end
CLOSE table_cursor;
DEALLOCATE table_cursor;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment