Background
More and more customers are looking to upgrade to SQL Server 2012, which offers some exciting features like AlwaysOn Availability Groups, ColumnStore Indexes and much more. As part of my job in the Microsoft Premier Field Engineering team, we are called upon by customers to assess their readiness to upgrade to the new version.
Normally, when we perform an upgrade readiness assessment, we also review the T-SQL code that the customer is running. This is done to uncover breaking changes and other patterns which might cause poor performance or such behavioral change post the upgrade. For breaking changes, we normally recommend customers to use the publicly available SQL Server Upgrade Advisor (SSUA) tool. However, not all breaking changes can be detected by the current SSUA toolset.
Stuff outside of SSUA scope
Here are some examples of T-SQL breaking changes which cannot be uncovered by SSUA. Some of these are boundary scenarios, but I feel it is important to list them so that you are aware of the issues. Also, some of these are known to the SSUA team but they would not incorporate checks for them in SSUA due to their ship timeline and priority ratings.
Issue |
Conflicting locking hints |
Description |
A specific issue in SQL Server 2000 caused locking hints in a FROM clause for an UPDATE statement, to be ignored. While this bug was fixed in SQL 2005, it potentially gave rise to upgrade issues if the locking hint in the FROM clause was different from the locking hint for the UPDATE source table. |
Example |
See this Connect bug for an example. |
Recommendation |
If at all used, locking hints need to be consistent between the table source and the FROM clause of the UPDATE. |
Issue |
Objects in the FROM clause must have distinct exposed names |
Description |
In SQL 2000, identically named tables from different databases did not require an alias |
Example |
This code will work in compatibility mode 80 while it will break on compatibility 90 and above:
select * from DB1.dbo.sometab join DB2.dbo.sometab on DB1.dbo.sometab.name = DB2.dbo.name
|
Recommendation |
It is generally a good practice in any case to alias all tables in a JOIN. That is the recommended solution in this case as well. |
Additional Reading |
You can read more about this at Nacho’s blog. |
Issue |
Subqueries are not supported in GROUP BY clause |
Description |
The GROUP BY clause cannot contain a subquery in an expression that is used for the group by list. In earlier versions of SQL Server, this was allowed. In SQL Server 2008, error 144 is returned. |
Recommendation |
Be aware of this breaking change and revise the query logic accordingly. |
Additional Reading |
There are some Connect articles which describe this. Read them here, here and here. |
Issue |
SETUSER statement usage |
Description |
SETUSER may not be supported in a future release of SQL Server. |
Recommendation |
We recommend that you use EXECUTE AS instead. |
Issue |
ORDER BY clauses in views |
Description |
The ORDER BY clause is not valid in views, inline functions, derived tables, and subqueries, unless the TOP or OFFSET and FETCH clauses are also specified. When ORDER BY is used in these objects, the clause is used only to determine the rows returned by the TOP clause or OFFSET and FETCH clauses. The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself. |
Recommendation |
Specify the ORDER BY clause only in the outermost query and not inside views. |
Issue |
FASTFIRSTROW table hint usage |
Description |
The usage of FASTFIRSTROW as a table hint has been disallowed in SQL 2012. We recommend that hints be used only as a last resort by experienced developers and database administrators. |
Recommendation |
You can evaluate the query hint OPTION (FAST 1) instead. |
Issue |
COMPUTE clause is not allowed in database compatibility 110 |
Description |
The COMPUTE clause generates totals that appear as additional summary columns at the end of the result set. However, this clause is no longer supported in SQL Server 2012. |
Recommendation |
Use the ROLLUP operator instead. |
Additional Info |
A Connect request has been logged to include this check in SSUA. Vote for it! |
Conclusion
So, now you know the most common patterns which you need to check for in addition to what SSUA already uncovers. However let’s say you have a huge T-SQL code base and cannot do this manually. Our PFE team are working on some offerings: SQL Server Upgrade Assessment and also a T-SQL Patterns and Practices Review, which among other things will also cover the above deprecation / upgrade checks. If you need more information, you can contact me for more details.
Also if you have any comments, additional cases which are not detected by SSUA, please leave a feedback item in the Comments section below. I read each one of them!