Cumulative Update 18 for SQL Server 2017

Applies to: SQL Server 2017 on Windows (all editions)SQL Server 2017 on Linux (all editions)

This article describes Cumulative Update package 18 (CU18) for SQL Server 2017. This update contains fixes that were released after the initial release of SQL Server 2017 and updates the SQL Server and Analysis services components to the following builds:

Component Product version File version
SQL Server 14.0.3257.3 2017.140.3257.3
Analysis Services 2017.140.249.21


Important notices

This article also provides important information about the following situations:

  • Pacemaker: A behavioral change is made in distributions that use the latest available version of Pacemaker. Mitigations methods are provided.
  • Query Store: You must run this script if you use Query Store and you have previously installed SQL Server 2017 Cumulative Update 2 (CU2).
  • Analysis Services CU build version: Beginning in SQL Server 2017, the Analysis Services build version number and SQL Server Database Engine build version number do not match. For more information, see Verify Analysis Services cumulative update build version.

Cumulative updates

Cumulative updates (CU) are now available at the Microsoft Download Center.

Only the most recent CU that was released for SQL Server 2017 is available at the Download Center.

CU packages for Linux are available at


  • Each new CU contains all the fixes that were included with the previous CU for the installed version of SQL Server.
  • SQL Server CUs are certified to the same levels as Service Packs, and should be installed at the same level of confidence.
  • Microsoft recommends ongoing, proactive installation of CUs as they become available according to these guidelines:
    • Historical data shows that a significant number of support cases involve an issue that has already been addressed in a released CU.
    • CUs may contain added value over and above hotfixes. This includes supportability, manageability, and reliability updates.
  • We recommend that you test CUs before you deploy them to production environments.

How to obtain this cumulative update package for Windows

The following update is available from the Microsoft Download Center:

If the download page does not appear, contact Microsoft Customer Service and Support to obtain the cumulative update package.


  • After future cumulative updates are released for SQL Server 2017, this and all previous CUs can be downloaded from the Microsoft Update Catalog. However, we recommend that you always install the latest cumulative update that is available.

How to obtain this cumulative update package for Linux

To update Linux to the latest CU, you must first have the Cumulative Update repository configured. Then, update your SQL Server packages by using the appropriate platform-specific update command.

For installation instructions and direct links to the CU package downloads, see the release notes.

Additional hotfixes that are included in this cumulative update package

VSTS bug number KB article number Description Fix area Platform
12519856 4470057 FIX: Error 41168 occurs when you try to alter DAG SEEDING_MODE in SQL Server 2016 and 2017 High Availability Windows
13087323 4506912 FIX: Concurrent inserts into a CCI can cause deadlock under memory pressure in SQL Server 2016 and 2017 SQL Engine Windows
13198909 4515772 FIX: Transaction log isn't truncated on a single node Availability Group in SQL Server High Availability Windows
13198915 4517771 FIX: Orphaned CLR sessions cause blocking in SQL Server SQL Engine Windows
13198907 4519679 FIX: Different users get the same model list with different permissions in SQL Server 2016 and 2017 Data Quality Services (DQS) Windows
13198903 4520739 FIX: Access violation error occurs when you try to insert results of stored procedure into a table with dynamic data masking in SQL Server 2016 and 2017 SQL security Windows
13200683 4521739 FIX: Error occurs when CDC capture process tries to insert duplicate key in table "cdc.lsn_time_mapping" in SQL Server 2016 and 2017 SQL Engine Windows
13197357 4524191 FIX: Menu and scroll bar are missing in "Changes" section when large number of changesets are added in Excel add-in for MDS in SQL Server 2017 Data Quality Services (DQS) Windows
13211437 4525483 FIX: Exception error 3628 may occur when you run store procedure in SQL Server 2016 and 2017 SQL Engine Windows
13218545 4526315 FIX: Database cannot recover and reports error 5243 in SQL Server 2016 and 2017 SQL Engine Windows
13193748 4526524 FIX: SQL patch does not update Local DB files correctly when installed using SqlLocalDb.msi Setup & Install Windows
13159453 4527229 FIX: UPDATE STATISTICS takes very long time to generate maintanence plan for large databases in SQL Server 2016 and 2017 Management Tools Windows
13212803 4527510 FIX: User hierarchy is not hidden when you run DISCOVER_CSDL_METADATA in SQL Server 2017 Analysis Services Windows
13197185 4527538 FIX: "A system assertion check has failed" error when a procedure call is made from CLR with an OUTPUT large object argument SQL performance Windows
13234374 4527842 FIX: SQL Server 2017 generates dump when you transfer ownership of full-text stoplist to another user if previous owner is dropped SQL Engine All
13210153 4527916 FIX: You may receive incorrect object_id after you switch a partition in SQL Server 2017 SQL Engine Windows
13207342 4528130 FIX: Access violation occurs when you restore the In-Memory Optimized database in SQL Server 2016 and 2017 In-Memory OLTP Windows
13179510 4529833 FIX: sp_describe_parameter_encryption returns different results if you switch parameter positions in SQL Server 2017 SQL security Windows
13203071 4529927 FIX: .NET Framework DbDataAdapter.FillSchema method returns NULL on database with compatibility level 140 in SQL Server 2017 SQL Engine Windows
13201028 4529942 FIX: Restore fails when you try to restore compressed TDE backups prior to SQL Server 2016 SP2 CU4 on SQL Server 2016 SP2 CU8 SQL Engine Windows
13165622 4530212 FIX: Access violation occurs when you use sys.dm_os_memory_objects in SQL Server 2016 and 2017 SQL performance Linux
13198726 4530251 FIX: Error 8601 occurs when you run a query with partition function in SQL Server SQL performance Windows
13261031 4530500 FIX: Assertion dump occurs when sp_cdc_disable_db is executed to disable CDC or when distributed transaction is commited after ROLLBACK SAVEPOINT in SQL Server SQL Engine Windows
13224871 4530720 FIX: "The File location cannot be opened" error occurs when you try to open a FileTable directory in SQL Server SQL Engine Windows
13262554 4530955 FIX: Error 18456 occurs when you run DMV queries on the SQL Server 2017 instance after rebuilding system databases Check with PG All
13212298 4531009 FIX: An access violation may occur when the optimizer uses an Adaptive Join in SQL Server 2017 SQL performance Windows
13284243 4532171 FIX: Symmetric key encryption takes longer time in SQL Server 2017 than in SQL Server 2012 SQL security Windows
12110364 4532751 Improvement: Snapshot replication and transactional replication are enabled on Linux in SQL Server 2017 SQL Engine Linux
13354946 4548001 FIX: Connection error occurs when you try to connect SQL Server 2017 on Linux by using OpenSSL 1.1 SQL Engine Linux

Notes for this update

Hybrid environments deployment

When you deploy an update to a hybrid environment (such as AlwaysOn, replication, cluster, and mirroring), we recommend that you refer to the following articles before you deploy the update:

Cumulative update package information


To apply this cumulative update package, you must be running SQL Server 2017.

Restart information

You may have to restart the computer after you apply this cumulative update package.

Registry information

To use one of the hotfixes in this package, you do not have to make any changes to the registry.

More CU package information

Pacemaker notice


All distributions (including RHEL 7.3 and 7.4) that use the latest available Pacemaker package 1.1.18-11.el7 introduce a behavior change for the start-failure-is-fatal cluster setting when its value is false. This change affects the failover workflow. If a primary replica experiences an outage, the cluster is expected to failover to one of the available secondary replicas. Instead, users will notice that the cluster keeps trying to start the failed primary replica. If that primary never comes online (because of a permanent outage), the cluster never fails over to another available secondary replica.

This issue affects all SQL Server versions, regardless of the cumulative update version that they are on.

To mitigate the issue, use either of the following methods.

Method 1

Follow these steps:

  1. Remove the start-failure-is-fatal override from the existing cluster. 
       # RHEL, Ubuntu         pcs property unset start-failure-is-fatal         # or         pcs property set start-failure-is-fatal=true   # SLES         crm configure property start-failure-is-fatal=true
  2. Decrease the cluster-recheck-interval value. 
       # RHEL, Ubuntu         pcs property set cluster-recheck-interval=<Xmin>   # SLES         crm configure property cluster-recheck-interval=<Xmin>
  3. Add the failure-timeout meta property to each AG resource. 
       # RHEL, Ubuntu         pcs resource update ag1 meta failure-timeout=60s   # SLES         crm configure edit ag1      # In the text editor, add `meta failure-timeout=60s` after any `param`s and before any `op`s

    Note In this code, substitute the value for <Xmin> as appropriate. If a replica goes down, the cluster tries to restart the replica at an interval that is bound by the failure-timeout value and the cluster-recheck-interval value. For example, if failure-timeout is set to 60 seconds and cluster-recheck-interval is set to 120 seconds, the restart is tried at an interval that is greater than 60 seconds but less than 120 seconds. We recommend that you set failure-timeout to 60s and cluster-recheck-interval to a value that is greater than 60 seconds. Setting cluster-recheck-interval to a small value is not recommended. For more information, refer to the Pacemaker documentation or consult the system provider.

Method 2

Revert to Pacemaker version 1.1.16.

    Query Store notice


    You must run this script if you use Query Store and you are updating from SQL Server 2017 Cumulative Update 2 (CU2) directly to SQL Server 2017 Cumulative Update 3 (CU3) or any later Cumulative Update. Executing this script is not needed if you have previously installed SQL Server 2017 Cumulative Update 3 (CU3) or any later SQL Server 2017 Cumulative Update.


    SET NOCOUNT ON;DROP TABLE IF EXISTS #tmpUserDBs;SELECT [database_id], 0 AS [IsDone]INTO #tmpUserDBsFROM master.sys.databasesWHERE [database_id] > 4 AND [state] = 0 -- must be ONLINE AND is_read_only = 0 -- cannot be READ_ONLY AND [database_id] NOT IN (SELECT dr.database_id FROM sys.dm_hadr_database_replica_states dr -- Except all local Always On secondary replicas  INNER JOIN sys.dm_hadr_availability_replica_states rs ON dr.group_id = rs.group_id  INNER JOIN sys.databases d ON dr.database_id = d.database_id  WHERE rs.role = 2 -- Is Secondary   AND dr.is_local = 1   AND rs.is_local = 1)DECLARE @userDB sysname;WHILE (SELECT COUNT([database_id]) FROM #tmpUserDBs WHERE [IsDone] = 0) > 0BEGIN SELECT TOP 1 @userDB = DB_NAME([database_id]) FROM #tmpUserDBs WHERE [IsDone] = 0 -- PRINT 'Working on database ' + @userDB EXEC ('USE [' + @userDB + '];DECLARE @clearPlan bigint, @clearQry bigint;IF EXISTS (SELECT [actual_state] FROM sys.database_query_store_options WHERE [actual_state] IN (1,2))BEGIN IF EXISTS (SELECT plan_id FROM sys.query_store_plan WHERE engine_version = ''14.0.3008.27'') BEGIN  DROP TABLE IF EXISTS #tmpclearPlans;  SELECT plan_id, query_id, 0 AS [IsDone]  INTO #tmpclearPlans  FROM sys.query_store_plan WHERE engine_version = ''14.0.3008.27''  WHILE (SELECT COUNT(plan_id) FROM #tmpclearPlans WHERE [IsDone] = 0) > 0  BEGIN   SELECT TOP 1 @clearPlan = plan_id, @clearQry = query_id FROM #tmpclearPlans WHERE [IsDone] = 0   EXECUTE sys.sp_query_store_unforce_plan @clearQry, @clearPlan;   EXECUTE sys.sp_query_store_remove_plan @clearPlan;   UPDATE #tmpclearPlans   SET [IsDone] = 1   WHERE plan_id = @clearPlan AND query_id = @clearQry  END;  PRINT ''- Cleared possibly affected plans in database [' + @userDB + ']'' END ELSE BEGIN  PRINT ''- No affected plans in database [' + @userDB + ']'' ENDENDELSEBEGIN PRINT ''- Query Store not enabled in database [' + @userDB + ']''END')  UPDATE #tmpUserDBs  SET [IsDone] = 1  WHERE [database_id] = DB_ID(@userDB)END