你好,我想弄清楚为什么在MSsql中将我的兼容模式从80改为100,破坏了我的功能呢?
- Microsoft sql Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43
- Copyright (c) Microsoft Corporation Express Edition with Advanced Services (64-bit) on
- Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
这是我的功能:
- GO
- ALTER FUNCTION [dbo].[GetRoot]
- (
- @Param1 int
- )
- RETURNS varchar(50)
- AS
- BEGIN
- DECLARE @ReturnValue varchar(50)
- with results as
- (
- select parentouid,net_ouid from net_ou where net_ouid=@Param1
- union all
- select t2.parentouid,t2.net_ouid from net_ou t2
- inner join results t1 on t1.parentouid = t2.net_ouid where t2.parentouid <> t1.net_ouid
- )
- select @ReturnValue = net_ou.displayname
- from NET_OU RIGHT OUTER JOIN
- results ON net_ou.net_ouid = results.ParentouID where results.parentouid=results.net_ouid
- RETURN @ReturnValue
- END
解决方法
尝试在前面投掷一个半个冒号:
- ;with results as
- (
- select parentouid,t2.net_ouid from net_ou t2
- inner join results t1 on t1.parentouid = t2.net_ouid where t2.parentouid <> t1.net_ouid
- )
给this article一个阅读,以了解为什么你需要这样做. Snipit:
However,if the CTE is not the first statement in the batch,you must
precede the WITH keyword with a semicolon. As a best practice,I
prefer to prefix all of my CTEs with a semicolon—I find this
consistent approach easier than having to remember whether I need a
semicolon or not.
就个人而言,我不会为每个CTE做这件事,但如果这样使得事情变得更容易,那就不会伤害任何东西.