diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index 462bc85c27..aba103185d 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -620,6 +620,7 @@ export function differentDbDifferentServerExampleUsage(server: string, db: strin //#region Target platforms export const targetPlatformToVersion: Map = new Map([ + // Note: the values here must match values from Microsoft.Data.Tools.Schema.SchemaModel.SqlPlatformNames [SqlTargetPlatform.sqlServer2012, '110'], [SqlTargetPlatform.sqlServer2014, '120'], [SqlTargetPlatform.sqlServer2016, '130'], @@ -627,7 +628,8 @@ export const targetPlatformToVersion: Map = new Map = new Map([ diff --git a/extensions/sql-database-projects/src/common/utils.ts b/extensions/sql-database-projects/src/common/utils.ts index 95aa988524..6af5cbaa81 100644 --- a/extensions/sql-database-projects/src/common/utils.ts +++ b/extensions/sql-database-projects/src/common/utils.ts @@ -718,9 +718,10 @@ export async function fileContainsCreateTableStatement(fullPath: string, project /** * Gets target platform based on the server edition/version * @param serverInfo server information + * @param serverUrl optional server URL, only used to check if it's a known domain for Microsoft Fabric DW * @returns target platform for the database project */ -export async function getTargetPlatformFromServerVersion(serverInfo: azdataType.ServerInfo | vscodeMssql.IServerInfo): Promise { +export async function getTargetPlatformFromServerVersion(serverInfo: azdataType.ServerInfo | vscodeMssql.IServerInfo, serverUrl?: string): Promise { const isCloud = serverInfo.isCloud; let targetPlatform; @@ -728,9 +729,25 @@ export async function getTargetPlatformFromServerVersion(serverInfo: azdataType. const engineEdition = serverInfo.engineEditionId; const azdataApi = getAzdataApi(); if (azdataApi) { - targetPlatform = engineEdition === azdataApi.DatabaseEngineEdition.SqlDataWarehouse ? SqlTargetPlatform.sqlDW : SqlTargetPlatform.sqlAzure; + // TODO: Update this when Fabric DW gets its own engine edition + // https://github.com/microsoft/azuredatastudio/issues/24112 + if (engineEdition === azdataApi.DatabaseEngineEdition.SqlOnDemand && isSqlDwUnifiedServer(serverUrl)) { + targetPlatform = SqlTargetPlatform.sqlDwUnified; + } else if (engineEdition === azdataApi.DatabaseEngineEdition.SqlDataWarehouse) { + targetPlatform = SqlTargetPlatform.sqlDW; + } else { + targetPlatform = SqlTargetPlatform.sqlAzure; + } } else { - targetPlatform = engineEdition === vscodeMssql.DatabaseEngineEdition.SqlDataWarehouse ? SqlTargetPlatform.sqlDW : SqlTargetPlatform.sqlAzure; + // TODO: Update this when Fabric DW gets its own engine edition + // https://github.com/microsoft/azuredatastudio/issues/24112 + if (engineEdition === vscodeMssql.DatabaseEngineEdition.SqlOnDemand && isSqlDwUnifiedServer(serverUrl)) { + targetPlatform = SqlTargetPlatform.sqlDwUnified; + } else if (engineEdition === vscodeMssql.DatabaseEngineEdition.SqlDataWarehouse) { + targetPlatform = SqlTargetPlatform.sqlDW; + } else { + targetPlatform = SqlTargetPlatform.sqlAzure; + } } } else { const serverMajorVersion = serverInfo.serverMajorVersion; @@ -740,6 +757,16 @@ export async function getTargetPlatformFromServerVersion(serverInfo: azdataType. return targetPlatform; } +/** + * Determines if a server name is a known domain for Microsoft Fabric DW. This is required because the engine edition for Fabric DW is the same as Serverless. + * @param server The server name to check + * @returns True if the server name matches a known domain for Microsoft Fabric DW, otherwise false + */ +export function isSqlDwUnifiedServer(server?: string): boolean | undefined { + const serverLowerCase = server?.toLowerCase(); + return serverLowerCase?.includes("datawarehouse.pbidedicated.windows.net") || serverLowerCase?.includes("datawarehouse.fabric.microsoft.com"); +} + /** * Determines if a given character is a valid filename character * @param c Character to validate diff --git a/extensions/sql-database-projects/src/controllers/projectController.ts b/extensions/sql-database-projects/src/controllers/projectController.ts index 11f899b8cf..7541d4ef98 100644 --- a/extensions/sql-database-projects/src/controllers/projectController.ts +++ b/extensions/sql-database-projects/src/controllers/projectController.ts @@ -1559,7 +1559,7 @@ export class ProjectsController { if (utils.getAzdataApi()) { let createProjectFromDatabaseDialog = this.getCreateProjectFromDatabaseDialog(profile as azdataType.IConnectionProfile); - createProjectFromDatabaseDialog.createProjectFromDatabaseCallback = async (model, connectionId) => await this.createProjectFromDatabaseCallback(model, connectionId); + createProjectFromDatabaseDialog.createProjectFromDatabaseCallback = async (model, connectionId) => await this.createProjectFromDatabaseCallback(model, connectionId, (profile as azdataType.IConnectionProfile)?.serverName); await createProjectFromDatabaseDialog.openDialog(); @@ -1575,7 +1575,7 @@ export class ProjectsController { } const model = await createNewProjectFromDatabaseWithQuickpick(profile as mssqlVscode.IConnectionInfo); if (model) { - await this.createProjectFromDatabaseCallback(model, profile as mssqlVscode.IConnectionInfo); + await this.createProjectFromDatabaseCallback(model, profile as mssqlVscode.IConnectionInfo, (profile as mssqlVscode.IConnectionInfo)?.server); } return undefined; } @@ -1586,7 +1586,7 @@ export class ProjectsController { return new CreateProjectFromDatabaseDialog(profile); } - public async createProjectFromDatabaseCallback(model: ImportDataModel, connectionInfo?: string | mssqlVscode.IConnectionInfo) { + public async createProjectFromDatabaseCallback(model: ImportDataModel, connectionInfo?: string | mssqlVscode.IConnectionInfo, serverName?: string) { try { const newProjFolderUri = model.filePath; @@ -1601,7 +1601,7 @@ export class ProjectsController { } if (serverInfo) { - targetPlatform = await utils.getTargetPlatformFromServerVersion(serverInfo); + targetPlatform = await utils.getTargetPlatformFromServerVersion(serverInfo, serverName); } const newProjFilePath = await this.createNewProject({ diff --git a/extensions/sql-database-projects/src/sqldbproj.d.ts b/extensions/sql-database-projects/src/sqldbproj.d.ts index dfd939fb5a..1499508fcb 100644 --- a/extensions/sql-database-projects/src/sqldbproj.d.ts +++ b/extensions/sql-database-projects/src/sqldbproj.d.ts @@ -321,7 +321,8 @@ declare module 'sqldbproj' { sqlServer2022 = 'SQL Server 2022', sqlAzure = 'Azure SQL Database', sqlDW = 'Azure Synapse SQL Pool', - sqlEdge = 'Azure SQL Edge' + sqlEdge = 'Azure SQL Edge', + sqlDwUnified = 'Synapse Data Warehouse in Microsoft Fabric' } export interface ISqlConnectionProperties {