Skip to content

Instantly share code, notes, and snippets.

@zonaro
Last active February 5, 2024 18:02
Show Gist options
  • Save zonaro/1d8334835c2064b6bd4446cb30678ef0 to your computer and use it in GitHub Desktop.
Save zonaro/1d8334835c2064b6bd4446cb30678ef0 to your computer and use it in GitHub Desktop.
Generate Dart Classes from table or Views
CREATE OR ALTER PROCEDURE [dbo].[GenerateDartClass] (@TableName sysname = null)
AS
BEGIN
DECLARE @Result VARCHAR(MAX) = ''
DECLARE the_cursor CURSOR FAST_FORWARD
FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_TYPE = 'BASE TABLE' OR TABLE_TYPE = 'VIEW') AND ISNULL(@TableName, TABLE_NAME) = TABLE_NAME
ORDER BY TABLE_TYPE, TABLE_NAME
OPEN the_cursor
FETCH NEXT FROM the_cursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Result = @Result + '
/// Class for ' + @TableName + '
class ' + REPLACE(REPLACE(REPLACE(@TableName, ' ', '_'), '.', '_'), '~', '_') + '
{
///Table Name
const String SQLTableName = "[' + @TableName + ']";
///DataBase Name
const String SQLDataBaseName = "[' + DB_NAME() + ']";
///Return a SELECT Query for ' + @TableName + '
String get query => "SELECT * FROM " + SQLDataBaseName + "." + SQLTableName;
///Return a SELECT Query for ' + @TableName + '
@override
String ToString() => getQuery();
/// Convert from JSON Map to ' + @TableName + ' object
factory ' + REPLACE(REPLACE(REPLACE(@TableName, ' ', '_'), '.', '_'), '~', '_') + '.fromJson(Map<String, dynamic> json) {
return ' + REPLACE(REPLACE(REPLACE(@TableName, ' ', '_'), '.', '_'), '~', '_') + '(
' + STUFF((
SELECT ',
json["' + ColumnName + '"] as ' + ColumnName
FROM
(
SELECT
REPLACE(REPLACE(REPLACE(col.name, ' ', '_'), '.', '_'), '~', '_') ColumnName,
column_id ColumnId
FROM sys.columns col
WHERE object_id = OBJECT_ID(@TableName)
) t
ORDER BY ColumnId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + '
);
}
/// Convert from ' + @TableName + ' object to JSON Map
Map<String, dynamic> toJson() {
return {
' + STUFF((
SELECT ',
"' + ColumnName + '": this.' + ColumnName
FROM
(
SELECT
REPLACE(REPLACE(REPLACE(col.name, ' ', '_'), '.', '_'), '~', '_') ColumnName,
column_id ColumnId
FROM sys.columns col
WHERE object_id = OBJECT_ID(@TableName)
) t
ORDER BY ColumnId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + '
};
}
' + STUFF((
SELECT '
///Name: [' + ColumnName + '] | Type: ' + ColumnType + ' | Scale: ' + CAST(scale AS VARCHAR) + ' | Precision: ' + CAST(precision AS VARCHAR) + ' | Max Length: ' + CAST(max_length AS VARCHAR) + ' | Allow Null: ' + IIF(is_nullable = 1, 'Yes', 'No') + '
public ' + ColumnType + NullableSign + ' ' + ColumnName + ';' + '
'
FROM
(
SELECT
REPLACE(REPLACE(REPLACE(col.name, ' ', '_'), '.', '_'), '~', '_') ColumnName,
column_id ColumnId,
CASE typ.name
WHEN 'bigint' THEN 'int'
WHEN 'binary' THEN 'List<int>'
WHEN 'bit' THEN 'bool'
WHEN 'char' THEN 'String'
WHEN 'date' THEN 'DateTime'
WHEN 'datetime' THEN 'DateTime'
WHEN 'datetime2' THEN 'DateTime'
WHEN 'datetimeoffset' THEN 'DateTime'
WHEN 'decimal' THEN 'double'
WHEN 'float' THEN 'double'
WHEN 'image' THEN 'List<int>'
WHEN 'int' THEN 'int'
WHEN 'money' THEN 'double'
WHEN 'nchar' THEN 'String'
WHEN 'ntext' THEN 'String'
WHEN 'numeric' THEN 'double'
WHEN 'nvarchar' THEN 'String'
WHEN 'real' THEN 'double'
WHEN 'smalldatetime' THEN 'DateTime'
WHEN 'smallint' THEN 'int'
WHEN 'smallmoney' THEN 'double'
WHEN 'text' THEN 'String'
WHEN 'time' THEN 'Duration'
WHEN 'timestamp' THEN 'int'
WHEN 'tinyint' THEN 'int'
WHEN 'uniqueidentifier' THEN 'String'
WHEN 'varbinary' THEN 'List<int>'
WHEN 'varchar' THEN 'String'
ELSE 'dynamic'
END ColumnType,
CASE
WHEN col.is_nullable = 1 THEN '?'
ELSE ''
END NullableSign,
col.scale,
col.precision,
col.is_nullable,
col.max_length
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
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + '
}'
FETCH NEXT FROM the_cursor INTO @TableName
END
CLOSE the_cursor
DEALLOCATE the_cursor
SET @Result = @Result + '
}'
PRINT @result
SELECT @Result
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment