You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
7.1 KiB
112 lines
7.1 KiB
using OpenDBDiff.Schema.SQLServer.Generates.Model;
|
|
using System.Text;
|
|
|
|
namespace OpenDBDiff.Schema.SQLServer.Generates.Generates.SQLCommands
|
|
{
|
|
internal static class FunctionSQLCommand
|
|
{
|
|
public static string Get(DatabaseInfo.SQLServerVersion version, DatabaseInfo.SQLServerEdition edition)
|
|
{
|
|
switch (version)
|
|
{
|
|
case DatabaseInfo.SQLServerVersion.SQLServer2005:
|
|
return Get2005();
|
|
|
|
case DatabaseInfo.SQLServerVersion.SQLServer2008:
|
|
return Get2008();
|
|
|
|
case DatabaseInfo.SQLServerVersion.SQLServerAzure10:
|
|
return GetAzure();
|
|
|
|
default:
|
|
if (edition == DatabaseInfo.SQLServerEdition.Azure)
|
|
return GetAzure();
|
|
else
|
|
return Get2008();
|
|
}
|
|
}
|
|
|
|
private static string Get2005()
|
|
{
|
|
string sql = "";
|
|
sql += "select distinct ";
|
|
sql += "T.name AS ReturnType, PP.max_length, PP.precision, PP.Scale, ";
|
|
sql += "ISNULL(CONVERT(varchar,AM.execute_as_principal_id),'CALLER') as ExecuteAs, ";
|
|
sql += "P.type, ";
|
|
sql += "AF.name AS assembly_name, ";
|
|
sql += "AM.assembly_class, ";
|
|
sql += "AM.assembly_id, ";
|
|
sql += "AM.assembly_method, ";
|
|
sql += "ISNULL('[' + S3.Name + '].[' + object_name(D2.object_id) + ']','') AS DependOut, '[' + S2.Name + '].[' + object_name(D.referenced_major_id) + ']' AS TableName, D.referenced_major_id, OBJECTPROPERTY (P.object_id,'IsSchemaBound') AS IsSchemaBound, P.object_id, S.name as owner, P.name as name from sys.objects P ";
|
|
sql += "INNER JOIN sys.schemas S ON S.schema_id = P.schema_id ";
|
|
sql += "LEFT JOIN sys.sql_dependencies D ON P.object_id = D.object_id ";
|
|
sql += "LEFT JOIN sys.objects O ON O.object_id = D.referenced_major_id ";
|
|
sql += "LEFT JOIN sys.schemas S2 ON S2.schema_id = O.schema_id ";
|
|
sql += "LEFT JOIN sys.sql_dependencies D2 ON P.object_id = D2.referenced_major_id ";
|
|
sql += "LEFT JOIN sys.objects O2 ON O2.object_id = D2.object_id ";
|
|
sql += "LEFT JOIN sys.schemas S3 ON S3.schema_id = O2.schema_id ";
|
|
sql += "LEFT JOIN sys.assembly_modules AM ON AM.object_id = P.object_id ";
|
|
sql += "LEFT JOIN sys.assemblies AF ON AF.assembly_id = AM.assembly_id ";
|
|
sql += "LEFT JOIN sys.parameters PP ON PP.object_id = AM.object_id AND PP.parameter_id = 0 and PP.is_output = 1 ";
|
|
sql += "LEFT JOIN sys.types T ON T.system_type_id = PP.system_type_id ";
|
|
sql += "WHERE P.type IN ('IF','FN','TF','FS') ORDER BY P.object_id";
|
|
return sql;
|
|
}
|
|
|
|
private static string Get2008()
|
|
{
|
|
var sql = new StringBuilder();
|
|
sql.AppendLine("SELECT DISTINCT ");
|
|
sql.AppendLine("T.name AS ReturnType, PP.max_length, PP.precision, PP.Scale, ");
|
|
sql.AppendLine("ISNULL(CONVERT(varchar,AM.execute_as_principal_id),'CALLER') as ExecuteAs, ");
|
|
sql.AppendLine("P.type, ");
|
|
sql.AppendLine("AF.name AS assembly_name, ");
|
|
sql.AppendLine("AM.assembly_class, ");
|
|
sql.AppendLine("AM.assembly_id, ");
|
|
sql.AppendLine("AM.assembly_method, ");
|
|
sql.AppendLine("ISNULL('[' + S3.Name + '].[' + object_name(D2.object_id) + ']','') AS DependOut, '[' + S2.Name + '].[' + object_name(D.referenced_major_id) + ']' AS TableName, D.referenced_major_id, OBJECTPROPERTY (P.object_id,'IsSchemaBound') AS IsSchemaBound, P.object_id, S.name as owner, P.name as name from sys.objects P ");
|
|
sql.AppendLine("INNER JOIN sys.schemas S ON S.schema_id = P.schema_id ");
|
|
sql.AppendLine("LEFT JOIN sys.sql_dependencies D ON P.object_id = D.object_id ");
|
|
sql.AppendLine("LEFT JOIN sys.objects O ON O.object_id = D.referenced_major_id ");
|
|
sql.AppendLine("LEFT JOIN sys.schemas S2 ON S2.schema_id = O.schema_id ");
|
|
sql.AppendLine("LEFT JOIN sys.sql_dependencies D2 ON P.object_id = D2.referenced_major_id ");
|
|
sql.AppendLine("LEFT JOIN sys.objects O2 ON O2.object_id = D2.object_id ");
|
|
sql.AppendLine("LEFT JOIN sys.schemas S3 ON S3.schema_id = O2.schema_id ");
|
|
sql.AppendLine("LEFT JOIN sys.assembly_modules AM ON AM.object_id = P.object_id ");
|
|
sql.AppendLine("LEFT JOIN sys.assemblies AF ON AF.assembly_id = AM.assembly_id ");
|
|
sql.AppendLine("LEFT JOIN sys.parameters PP ON PP.object_id = AM.object_id AND PP.parameter_id = 0 and PP.is_output = 1 ");
|
|
sql.AppendLine("LEFT JOIN sys.types T ON T.system_type_id = PP.system_type_id ");
|
|
sql.AppendLine("WHERE P.type IN ('IF','FN','TF','FS') ORDER BY P.object_id");
|
|
return sql.ToString();
|
|
}
|
|
|
|
private static string GetAzure()
|
|
{
|
|
var sql = new StringBuilder();
|
|
sql.AppendLine("SELECT DISTINCT ");
|
|
sql.AppendLine("T.name AS ReturnType, PP.max_length, PP.precision, PP.Scale, ");
|
|
sql.AppendLine("ISNULL(CONVERT(varchar,AM.execute_as_principal_id),'CALLER') as ExecuteAs, ");
|
|
sql.AppendLine("P.type, ");
|
|
sql.AppendLine("AF.name AS assembly_name, ");
|
|
sql.AppendLine("AM.assembly_class, ");
|
|
sql.AppendLine("AM.assembly_id, ");
|
|
sql.AppendLine("AM.assembly_method, ");
|
|
sql.AppendLine("ISNULL('[' + S3.Name + '].[' + object_name(D2.referencing_id) + ']','') AS DependOut, ");
|
|
sql.AppendLine("'[' + S2.Name + '].[' + object_name(D.referenced_id) + ']' AS TableName, D.referenced_id AS referenced_major_id, OBJECTPROPERTY (P.object_id,'IsSchemaBound') AS IsSchemaBound, P.object_id, S.name as owner, P.name as name from sys.objects P ");
|
|
sql.AppendLine("INNER JOIN sys.schemas S ON S.schema_id = P.schema_id ");
|
|
sql.AppendLine("LEFT JOIN sys.sql_expression_dependencies D ON P.object_id = D.referencing_id ");
|
|
sql.AppendLine("LEFT JOIN sys.objects O ON O.object_id = D.referenced_id ");
|
|
sql.AppendLine("LEFT JOIN sys.schemas S2 ON S2.schema_id = O.schema_id ");
|
|
sql.AppendLine("LEFT JOIN sys.sql_expression_dependencies D2 ON P.object_id = D2.referenced_id ");
|
|
sql.AppendLine("LEFT JOIN sys.objects O2 ON O2.object_id = D2.referencing_id ");
|
|
sql.AppendLine("LEFT JOIN sys.schemas S3 ON S3.schema_id = O2.schema_id ");
|
|
sql.AppendLine("CROSS JOIN (SELECT null as object_id, null as execute_as_principal_id, null as assembly_class, null as assembly_id, null as assembly_method) AS AM ");
|
|
sql.AppendLine("CROSS JOIN (SELECT null AS name) AS AF");
|
|
sql.AppendLine("LEFT JOIN sys.parameters PP ON PP.object_id = AM.object_id AND PP.parameter_id = 0 and PP.is_output = 1 ");
|
|
sql.AppendLine("LEFT JOIN sys.types T ON T.system_type_id = PP.system_type_id ");
|
|
sql.AppendLine("WHERE P.type IN ('IF','FN','TF','FS') ORDER BY P.object_id");
|
|
return sql.ToString();
|
|
}
|
|
}
|
|
}
|