Sql server 2008 r2 如何强制SQL Server 2008 R2接受不属于表的列上的ORDER BY?

Sql server 2008 r2 如何强制SQL Server 2008 R2接受不属于表的列上的ORDER BY?,sql-server-2008-r2,sql-server-2000,sql-order-by,Sql Server 2008 R2,Sql Server 2000,Sql Order By,在将继承的一堆应用程序迁移到时,我遇到了一种现在失败的风格 查询是由一种SQL生成层生成的(如果更好的话,会尽快修复该层,但这是不好的)。如果可能的话,我想推迟修复SQL生成层,直到我为它构建了一个像样的测试工具 小示例(无论使用哪种表:常规表或本地/全局临时表): 罪魁祸首是#IDTABLE没有名称列。 SQL Server 2000执行此操作,并采用名称,它引用#NAMETABLE.NAME。 SQL Server 2008 R2因“列名'name'无效”而失败 有几个问题: 是否可以强制

在将继承的一堆应用程序迁移到时,我遇到了一种现在失败的风格

查询是由一种SQL生成层生成的(如果更好的话,会尽快修复该层,但这是不好的)。如果可能的话,我想推迟修复SQL生成层,直到我为它构建了一个像样的测试工具

小示例(无论使用哪种表:常规表或本地/全局临时表):

罪魁祸首是
#IDTABLE
没有
名称
列。 SQL Server 2000执行此操作,并采用
名称
,它引用
#NAMETABLE.NAME
。 SQL Server 2008 R2因“列名'name'无效”而失败

有几个问题:

  • 是否可以强制SQL Server 2008 R2接受此类查询并执行SQL Server 2000行为(这样我们就可以修复SQL生成层并对其执行回归)
  • 这类查询失败的原因是什么版本的SQL Server
  • 为什么SQLServer2000会乐于接受这种查询
如果您想查看行为,下面是一个完整的示例:

create table #IDTABLE (
    ID Integer
)

create table #NAMETABLE (
    ID Integer,
    NAME VarChar(50)
)

insert into #IDTABLE values (0)
insert into #IDTABLE values (1)
insert into #IDTABLE values (2)

insert into #NAMETABLE values (0, 'FOO')
insert into #NAMETABLE values (1, 'BAR')
insert into #NAMETABLE values (2, 'SNAFU')

select *
from #IDTABLE

select *
from #NAMETABLE

select
  #IDTABLE.*,
  #NAMETABLE.NAME as NAME -- NAME alias is mandatory for SQL Server 2000 to succeed
from #IDTABLE
left join #NAMETABLE on #IDTABLE.ID = #NAMETABLE.ID
order by #IDTABLE.NAME

drop table #IDTABLE
drop table #NAMETABLE
输出为:

您可以临时将其破解为“工作”:

ALTER DATABASE [your database] SET COMPATIBILITY_LEVEL = 80;
不过,您最好在升级到SQL Server 2012之前修复生成层以生成有效的SQL,因为该compat级别在那里不再有效,并且在代码中断90或以上的情况下也不再有效。不要介意将数据库设置为80可能会产生其他不希望的副作用-我在这里讨论这些副作用:

(顺便说一句,如果
##IDTABLE
没有
名称
列,那么它究竟为什么首先要生成
##IDTABLE.NAME

您可以将其临时修改为“工作”:

ALTER DATABASE [your database] SET COMPATIBILITY_LEVEL = 80;
不过,您最好在升级到SQL Server 2012之前修复生成层以生成有效的SQL,因为该compat级别在那里不再有效,并且在代码中断90或以上的情况下也不再有效。不要介意将数据库设置为80可能会产生其他不希望的副作用-我在这里讨论这些副作用:


(顺便提一下,如果
##IDTABLE
没有
名称
列,那么它究竟为什么首先生成
##IDTABLE.NAME

只是为了让你意识到这个选项:为什么这么多人突然使用了#全局临时表?您是否测试过由多个用户同时运行此代码?他们是龙!废话,那是一个搜索替换输入错误。很抱歉修正了。你的IDTABLE没有“NAME”列。@GranadCoder他知道这一点。SQL Server 2000在检查列的来源方面有点懒散,基本上忽略了别名。只是想让您知道这个选项:为什么这么多人突然使用##全局临时表?您是否测试过由多个用户同时运行此代码?他们是龙!废话,那是一个搜索替换输入错误。很抱歉修正了。你的IDTABLE没有“NAME”列。@GranadCoder他知道这一点。SQL Server 2000在检查列的来源方面有点懒惰,基本上忽略了别名。这也是我首先想到的问题。然后我看到了密码+1,接受。感谢您的快速回答。之所以生成它,是因为生成器的构造函数有一个
一个
顺序
参数,并且在发出SQL时,它总是像
顺序一样附加它。我需要改变这个雷区,这样它才能正确地理解关系。这也是我首先想到的。然后我看到了密码+1,接受。感谢您的快速回答。之所以生成它,是因为生成器的构造函数有一个
一个
顺序
参数,并且在发出SQL时,它总是像
顺序一样附加它。我需要改变雷区,让它正确地理解关系。
ALTER DATABASE [your database] SET COMPATIBILITY_LEVEL = 80;