diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index 9bb78519de..31ab6df75c 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -594,6 +594,15 @@ export const targetPlatformToVersion: Map = new Map = new Map([ + [11, SqlTargetPlatform.sqlServer2012], + [12, SqlTargetPlatform.sqlServer2014], + [13, SqlTargetPlatform.sqlServer2016], + [14, SqlTargetPlatform.sqlServer2017], + [15, SqlTargetPlatform.sqlServer2019], + [16, SqlTargetPlatform.sqlServer2022] +]); + // DW is special since the system dacpac folder has a different name from the target platform export const AzureDwFolder = 'AzureDw'; diff --git a/extensions/sql-database-projects/src/common/utils.ts b/extensions/sql-database-projects/src/common/utils.ts index 8cd2c33e0f..cdf477f16e 100644 --- a/extensions/sql-database-projects/src/common/utils.ts +++ b/extensions/sql-database-projects/src/common/utils.ts @@ -15,7 +15,7 @@ import * as vscodeMssql from 'vscode-mssql'; import * as fse from 'fs-extra'; import * as which from 'which'; import { promises as fs } from 'fs'; -import { ISqlProject } from 'sqldbproj'; +import { ISqlProject, SqlTargetPlatform } from 'sqldbproj'; export interface ValidationResult { errorMessage: string; @@ -711,3 +711,24 @@ export async function fileContainsCreateTableStatement(fullPath: string, project return containsCreateTableStatement; } + +/** + * Gets target platform based on the server edition/version + * @param connectionId server connection profile id + * @returns target platform for the database project + */ +export async function getTargetPlatformFromServerVersion(connectionId: string): Promise { + const serverInfo = await getAzdataApi()!.connection.getServerInfo(connectionId); + const isCloud = serverInfo.isCloud; + + let targetPlatform; + if (isCloud) { + const engineEdition = serverInfo.engineEditionId; + targetPlatform = engineEdition === getAzdataApi()!.DatabaseEngineEdition.SqlDataWarehouse ? SqlTargetPlatform.sqlDW : SqlTargetPlatform.sqlAzure; + } else { + const serverMajorVersion = serverInfo.serverMajorVersion; + targetPlatform = serverMajorVersion ? constants.onPremServerVersionToTargetPlatform.get(serverMajorVersion) : undefined; + } + + return targetPlatform; +} diff --git a/extensions/sql-database-projects/src/controllers/projectController.ts b/extensions/sql-database-projects/src/controllers/projectController.ts index 70c071e907..aae92b9ae0 100644 --- a/extensions/sql-database-projects/src/controllers/projectController.ts +++ b/extensions/sql-database-projects/src/controllers/projectController.ts @@ -1404,7 +1404,7 @@ export class ProjectsController { if (utils.getAzdataApi()) { let createProjectFromDatabaseDialog = this.getCreateProjectFromDatabaseDialog(profile as azdataType.IConnectionProfile); - createProjectFromDatabaseDialog.createProjectFromDatabaseCallback = async (model) => await this.createProjectFromDatabaseCallback(model); + createProjectFromDatabaseDialog.createProjectFromDatabaseCallback = async (model, connectionId) => await this.createProjectFromDatabaseCallback(model, connectionId); await createProjectFromDatabaseDialog.openDialog(); @@ -1431,16 +1431,21 @@ export class ProjectsController { return new CreateProjectFromDatabaseDialog(profile); } - public async createProjectFromDatabaseCallback(model: ImportDataModel) { + public async createProjectFromDatabaseCallback(model: ImportDataModel, connectionId?: string) { try { const newProjFolderUri = model.filePath; + let targetPlatform: SqlTargetPlatform | undefined; + if (connectionId) { + targetPlatform = await utils.getTargetPlatformFromServerVersion(connectionId); + } const newProjFilePath = await this.createNewProject({ newProjName: model.projName, folderUri: vscode.Uri.file(newProjFolderUri), projectTypeId: model.sdkStyle ? constants.emptySqlDatabaseSdkProjectTypeId : constants.emptySqlDatabaseProjectTypeId, - sdkStyle: model.sdkStyle + sdkStyle: model.sdkStyle, + targetPlatform: targetPlatform }); model.filePath = path.dirname(newProjFilePath); diff --git a/extensions/sql-database-projects/src/dialogs/createProjectFromDatabaseDialog.ts b/extensions/sql-database-projects/src/dialogs/createProjectFromDatabaseDialog.ts index 8aea5ce179..9c1ac0fb44 100644 --- a/extensions/sql-database-projects/src/dialogs/createProjectFromDatabaseDialog.ts +++ b/extensions/sql-database-projects/src/dialogs/createProjectFromDatabaseDialog.ts @@ -32,7 +32,7 @@ export class CreateProjectFromDatabaseDialog { private toDispose: vscode.Disposable[] = []; private initDialogComplete: Deferred = new Deferred(); - public createProjectFromDatabaseCallback: ((model: ImportDataModel) => any) | undefined; + public createProjectFromDatabaseCallback: ((model: ImportDataModel, connectionId?: string) => any) | undefined; constructor(private profile: azdataType.IConnectionProfile | undefined) { this.dialog = getAzdataApi()!.window.createModelViewDialog(constants.createProjectFromDatabaseDialogName, 'createProjectFromDatabaseDialog'); @@ -411,7 +411,7 @@ export class CreateProjectFromDatabaseDialog { }; azdataApi!.window.closeDialog(this.dialog); - await this.createProjectFromDatabaseCallback!(model); + await this.createProjectFromDatabaseCallback!(model, this.connectionId!); this.dispose(); }