一台计算机上的SQL语法错误,而另一台计算机上的SQL语法错误

一台计算机上的SQL语法错误,而另一台计算机上的SQL语法错误,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我有一个我正在维护的旧网站(主要是用vbscript在经典ASP中构建的)。我正在对其进行一些修改,并且厌倦了每次在显示前20条记录之前,我都要浏览从数据库加载99000条记录的其中一个页面,等待5分钟,因此我将代码重写为: sSQL = "WITH OrderedAgreements AS (SELECT *, ROW_NUMBER() OVER (ORDER BY " & strSort & ") AS 'RowNumber' FROM ServiceAgreement "

我有一个我正在维护的旧网站(主要是用vbscript在经典ASP中构建的)。我正在对其进行一些修改,并且厌倦了每次在显示前20条记录之前,我都要浏览从数据库加载99000条记录的其中一个页面,等待5分钟,因此我将代码重写为:

sSQL = "WITH OrderedAgreements AS (SELECT *, ROW_NUMBER() OVER (ORDER BY " & strSort & ") AS 'RowNumber' FROM ServiceAgreement " & WhereClause & ")"
sSQL = sSQL & " SELECT * FROM OrderedAgreements WHERE RowNumber BETWEEN " & iStartRec & " AND " & iStartRec + iPageSize - 1
Set rs = Server.CreateObject("ADODB.Recordset")

rs.Open sSQL, SQLConn, adOpenStatic, adLockReadOnly
(目标是仅返回实际显示的行)

在我的本地开发计算机(Windows 7)上从IIS-7运行时,此功能运行良好。它正在邻近实验室的开发服务器上访问SQL Server 2008下的测试数据库

但是,当我在生产服务器的beta站点上运行相同的代码时(即,生产站点的并行目录树,通过不同的HTTP端口访问),它会给我一个“关键字'WITH'附近的语法错误”

生产服务器正在运行Windows server 2003 R2和IIS 6,但我想不出为什么这会在一台机器上而不是在另一台机器上导致错误。它们运行相同的代码,连接到相同的数据库,使用相同的命令序列访问。我甚至输入了一些日志代码来输出正在生成的SQL,这两种情况下都是相同的。这两台机器都运行2.0/3.0/3.5框架。这两台机器都安装了SQL Server 2008

我可以访问生产服务器(通过RDP),但它没有Visual Studio。我几乎无计可施,无法弄清楚为什么同一代码在一台机器上而不是在另一台机器上出现SQL语法错误

有人能给我一个如何进行的线索吗?
谢谢。

选项。按可能性的顺序

  • 最重要的是什么
    sp_helpdb
    将显示给您。您需要年满90岁才能使用CTE

  • SELECT@@VERSION在两台SQL服务器上都说明了什么?真的在2008年吗

  • 试试
    ;如果在CTE之前有一个额外的SQL命令,请使用…


观察。。。为什么不使用参数而不是字符串连接?

两个站点都连接到同一个SQL Server,即使它们都安装了SQL Server。两者都没有在机器上的数据库上运行-它们都连接到同一个远程开发数据库。所以我假设SELECT@@VERSION在这两种情况下都返回相同的内容,因为它们连接到同一个DB。我假设sp_helpdb也是这样,但我会尝试一下。我将尝试使用分号,但由于sSQL字符串开始时为空,因此我看不出它前面怎么会有语句。您必须检查远程SQL Server:这是您的SQL运行的地方。谁在乎本地安装了什么?此外,它们是否连接到具有不同兼容级别的不同数据库?我还要选中SELECT@@SERVERNAME以确保所有SQL都在同一个框中运行。来自不同客户端的同一实例上同一数据库上的同一SQL不会以不同方式运行。嗯,我不确定它是哪一个-我将兼容性级别从80更改为90(希望这不会导致任何其他问题-我认为默认情况下是这样的,因为数据库最初是从较旧的服务器迁移的),我还加了分号。它现在可以在beta服务器上运行。所以我不会抱怨。感谢您的帮助。+1用于“避免字符串串联”。。。你可能会想,到现在为止,所有关于SQL注入攻击的讨论,每个人都知道要100%避免这种情况…@Dave Hanna:80是SQL Server 2000,90是SQL Server 2005。SQL Server 2000不支持CTE,因此导致此错误