Skip to content

Commit

Permalink
Merge branch 'kusto-functions-support' of https://github.com/barnuri/…
Browse files Browse the repository at this point in the history
…EFCorePowerTools into kusto-functions-support
  • Loading branch information
barnuri committed Oct 13, 2024
2 parents ea4bf07 + 478f7d1 commit 3f64d1f
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,14 @@ protected override List<List<ModuleResultElement>> GetResultElementLists(SqlConn
var sql = $@"
SELECT
c.name,
t.name AS type_name,
COALESCE(ts.name, tu.name) AS type_name,
c.column_id AS column_ordinal,
c.is_nullable
FROM sys.columns c
inner JOIN sys.types AS t ON c.user_type_id = t.user_type_id
inner join sys.types tu ON c.user_type_id = tu.user_type_id
inner join sys.objects AS o on o.object_id = c.object_id
inner JOIN sys.schemas AS s ON o.schema_id = s.schema_id
LEFT JOIN sys.types ts ON tu.system_type_id = ts.user_type_id
where o.name = '{module.Name}' and s.name = '{module.Schema}';";

#pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
Expand Down
66 changes: 49 additions & 17 deletions src/Core/RevEng.Core.60/Routines/SqlServerRoutineModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,14 @@ protected RoutineModel GetRoutines(string connectionString, ModuleModelFactoryOp
};
}

private static string GetVersion(SqlConnection connection)
{
using var command = connection.CreateCommand();
command.CommandText = "SELECT @@VERSION;";
var result = command.ExecuteScalar();
return result as string;
}

private static Dictionary<string, List<ModuleParameter>> GetParameters(SqlConnection connection)
{
using var dtResult = new DataTable();
Expand All @@ -172,28 +180,52 @@ private static Dictionary<string, List<ModuleParameter>> GetParameters(SqlConnec
var sql = $@"
SELECT
'Parameter' = p.name,
'Type' = t.name,
'Type' = COALESCE(type_name(p.system_type_id), type_name(p.user_type_id)),
'Length' = CAST(p.max_length AS INT),
'Precision' = CASE
WHEN t.name = 'uniqueidentifier' THEN p.precision
WHEN t.name IN ('decimal', 'numeric') THEN p.precision
WHEN t.name IN ('varchar', 'nvarchar') THEN p.max_length
ELSE NULL
END,
'Scale' = CAST(p.scale AS INT),
'Order' = CAST(p.parameter_id AS INT),
'Precision' = CAST(case when type_name(p.system_type_id) = 'uniqueidentifier'
then p.precision
else OdbcPrec(p.system_type_id, p.max_length, p.precision) end AS INT),
'Scale' = CAST(OdbcScale(p.system_type_id, p.scale) AS INT),
'Order' = CAST(parameter_id AS INT),
p.is_output AS output,
'TypeName' = QUOTENAME(s.name) + '.' + QUOTENAME(t.name),
'TypeName' = QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(TYPE_NAME(p.user_type_id)),
'TypeSchema' = t.schema_id,
'TypeId' = p.user_type_id,
'RoutineName' = o.name,
'RoutineSchema' = s.name
'RoutineName' = OBJECT_NAME(p.object_id),
'RoutineSchema' = OBJECT_SCHEMA_NAME(p.object_id)
from sys.parameters p
inner join sys.objects AS o on o.object_id = p.object_id
inner JOIN sys.types AS t ON p.user_type_id = t.user_type_id
inner JOIN sys.schemas AS s ON o.schema_id = s.schema_id
ORDER BY p.object_id, p.parameter_id;
";
LEFT JOIN sys.table_types t ON t.user_type_id = p.user_type_id
ORDER BY p.object_id, p.parameter_id;";

if (GetVersion(connection) == "Microsoft SQL Kusto")
{
sql = $@"
SELECT
'Parameter' = p.name,
'Type' = COALESCE(ts.name, tu.name),
'Length' = CAST(p.max_length AS INT),
'Precision' = CASE
WHEN ts.name = 'uniqueidentifier' THEN p.precision
WHEN ts.name IN ('decimal', 'numeric') THEN p.precision
WHEN ts.name IN ('varchar', 'nvarchar') THEN p.max_length
ELSE NULL
END,
'Scale' = CAST(p.scale AS INT),
'Order' = CAST(p.parameter_id AS INT),
p.is_output AS output,
'TypeName' = QUOTENAME(s.name) + '.' + QUOTENAME(tu.name),
'TypeSchema' = tu.schema_id,
'TypeId' = p.user_type_id,
'RoutineName' = o.name,
'RoutineSchema' = s.name
from sys.parameters p
inner join sys.objects AS o on o.object_id = p.object_id
inner JOIN sys.schemas AS s ON o.schema_id = s.schema_id
inner join sys.types tu ON p.user_type_id = tu.user_type_id
LEFT JOIN sys.types ts ON tu.system_type_id = ts.user_type_id
ORDER BY p.object_id, p.parameter_id;
";
}

using var adapter = new SqlDataAdapter
{
Expand Down

0 comments on commit 3f64d1f

Please sign in to comment.