Sql server 关闭兼容性模式,从80变为90。因为错误而变得怪异

Sql server 关闭兼容性模式,从80变为90。因为错误而变得怪异,sql-server,tsql,Sql Server,Tsql,我们已经在兼容模式下运行了一个SQLServer2005数据库,并将其迁移到兼容级别80SQLServer2000 我们确实需要开始使用表UDF,并且有一个特定的动态存储过程,我们需要使用varcharMAX。所以,我们正在测试关闭兼容性模式,并在原生2005模式下运行数据库 当我在我们的测试副本上执行此操作时,当我运行在级别80下运行良好的存储过程时,会出现错误。这些错误与WITH语句有关。我在存储过程中有一个CTE,但正在执行的代码分支甚至没有触及它,而是将其包含在正在执行的SQL中。我在W

我们已经在兼容模式下运行了一个SQLServer2005数据库,并将其迁移到兼容级别80SQLServer2000

我们确实需要开始使用表UDF,并且有一个特定的动态存储过程,我们需要使用varcharMAX。所以,我们正在测试关闭兼容性模式,并在原生2005模式下运行数据库

当我在我们的测试副本上执行此操作时,当我运行在级别80下运行良好的存储过程时,会出现错误。这些错误与WITH语句有关。我在存储过程中有一个CTE,但正在执行的代码分支甚至没有触及它,而是将其包含在正在执行的SQL中。我在WITH前面加了一个分号。问题似乎是我的NOLOCK语句有问题?但它们不是CTE

错误

关键字“with”附近的语法不正确。如果此语句是公共表表达式或xmlnamespaces子句,则前面的语句必须以分号终止


我知道发生了什么。如果您使用的是CTE和WITHNOLOCK,如果您首先使用WITHNOLOCK,则需要终止CTE的WITH语句

这个很好用

WITH cteAreaCOdes(AreaCode, State)
AS
(
SELECT AreaCode, State from tblAreaCodes
)

SELECT * FROM tblCustomers WITH(NOLOCK)

SELECT * FROM cteAreaCOdes WITH(NOLOCK)
这不

SELECT * FROM tblCustomers WITH(NOLOCK)

WITH cteAreaCOdes(AreaCode, State)
AS
(
SELECT AreaCode, State from tblAreaCodes
)

SELECT * FROM cteAreaCOdes WITH(NOLOCK)
抛出错误

Msg 319,第15级,状态1,第6行 关键字“with”附近的语法不正确。如果此语句是公共表表达式或xmlnamespaces子句,则前面的语句必须以分号终止

然后我从tblCustomers中删除了WITH,只使用了NOLOCK,因为在2k5中不需要WITH,但这也不起作用

抛出错误

Msg 336,第15级,状态1,第6行 “cteAreaCOdes”附近的语法不正确。如果这是一个公共表表达式,则需要使用分号显式终止前面的语句

完全删除NOLOCK并只运行一个简单的SELECT语句会引发相同的错误。所以基本上,如果我使用的是CTE,我需要终止它,如果任何其他SELECT语句出现在它之前

这实际上不应该如此混乱,用语句终止all的简单经验法则可以解决我的所有问题,问题的出现是因为兼容模式80 SQL 2k中的SQL2k5允许我上面尝试过的所有语句正常工作


所以它允许CTE,而SQL2K不需要CTE,然而,它不需要在任何地方终止WITH语句

嗯,SQLServer2000不支持公共表表达式。你确定之前/之后的兼容性模式设置吗?你需要共享引发错误的代码,我们没有必要猜测它可能是什么。;如果您在兼容模式80 SQL 2000下运行SQL 2k5,则CTE可以工作。我不知道为什么,但我记得不久前读到过关于它的文章,我知道在SQL 25k但Compat Mode 80中,我在几个地方使用它们,没有问题。我将在postedOh中获得一个代码示例,还有一件事要告诉metntion。我遇到了这个错误,在我终止存储过程中的所有内容后,我无法找出它。我调用的UDF中有一个CTE,这导致了错误。同样,这一切在SQL25K80兼容模式下运行良好。