My application dbscript queries the system catalog views to retrieve a database schema, and uses different SELECT statements for SQL Server 2000 and for 2005 and higher. To my surprise, it recently raised a syntax error when reading from a 2008 database:
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near ‘sys’.
The statements typically look like this
SELECT sys.xml_schema_collections.xml_collection_id, sys.schemas.name as schema_name, sys.xml_schema_collections.name, ep.value as Description FROM sys.xml_schema_collections INNER JOIN sys.schemas ON sys.schemas.schema_id = sys.xml_schema_collections.schema_id OUTER APPLY fn_listextendedproperty('MS_Description', 'SCHEMA', sys.schemas.name, 'XML SCHEMA COLLECTION', sys.xml_schema_collections.name, null, null) ep WHERE xml_collection_id > 1 ORDER BY sys.xml_schema_collections.name
Note the OUTER APPLY invocation of the table-valued function fn_listextendedproperty().
A quick search led me to this thread suggesting that the compatibility level of the database may not be the most current (100 for SQL Server 2008). I checked, and indeed compatibility level was 80 as a result of restoring a SQL Server 2000 database. Setting the compatibility level to 100 fixed the problem.
Personally, I find the compatibility level a bit inconsistent (see descriptions for sp_dbcmptlevel and ALTER DATABASE).
T-SQL 2000 simply did not have an OUTER APPLY, nor a fn_listextendedproperty() (without preceding ::), nor the sys schema.
Its description
Sets certain database behaviors to be compatible with the specified version of SQL Server
does not mention APPLYs or table-valued functions. And it’s not clear why exactly a parameter to a TVF is causing the syntax error. I guess that’s outside the scope of “certain behaviors”.
Lesson learned: when restoring a database from a different server version, check the compatibility levels 😉
Here’s the statement to do so:
select name, compatibility_level from sys.databases