I understood that setting a database to a COMPATIBILITY_LEVEL prior to your native one prevented features from being used. However this doesn't seem to be the case. Witness the following SQL script:
CREATE DATABASE Foo
GO
USE Foo
GO
ALTER DATABASE Foo SET COMPATIBILITY_LEVEL = 80
GO
CREATE TABLE Bar
(
Id UNIQUEIDENTIFIER NOT NULL,
TestNvcMax NVARCHAR (MAX) NOT NULL, -- Arrived in SQL 2005
TestDateTime2 DATETIME2 (7) NOT NULL -- Arrived in SQL 2008
)
GO
But this table creates perfectly - any ideas? I would have thought some kind of an error message or warning would have been appropriate
You can use Transact-SQL to view or change the compatibility level of a database using SSMS or Azure Data Studio.
Microsoft SQL Server can attach databases from older versions, but not newer versions. For example, SQL Server 2008 can attach a database that was detached from the 2005 version, but not one detached from the 2012 version.
When you are on SQL Server 2016 or newer, using database compatibility level 130 will use CE130 by default, and will enable a number of other performance related changes. The effects of global trace flags 1117, 1118, and 2371 are enabled with database compatibility level 130.
Upgrade compatibility level degrades performance - SQL Server | Microsoft Learn.
BOL says:
Compatibility level provides only partial backward compatibility with earlier versions of SQL Server.
Also:
New functionality might work under older compatibility levels, but SET options might require adjustments.
I believe that is your case.
Here you can read about the differences between compatibility level 80, 90 and 100. ALTER DATABASE Compatibility Level
Apparently new data types is not affected. I think that compatibility level is there to make SQL Server "behave" like the older version, not prevent you from doing new fancy stuff.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With