首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于sql2008跟sql2000查询分析器的sql写法区别

2013-06-19 
关于sql2008和sql2000查询分析器的sql写法区别以下是我写的存储过程的报错的部分我截取一部分给大家看一下

关于sql2008和sql2000查询分析器的sql写法区别
以下是我写的存储过程的报错的部分
我截取一部分给大家看一下,麻烦告诉我一下哪里有错
alter PROCEDURE [dbo].[cleartele]
@CYear int,
@CMonth smallint,
@Error_Var int output
AS
DECLARE @STRCURDATE VARCHAR(7)
declare @telecode varchar(16)
declare @paydate datetime
declare @currpretotal numeric(7,2)
declare @i int
declare @m int
declare @year int
declare @month int
declare @currlevel smallint
DECLARE @STRINDEX VARCHAR(7)
DECLARE @WASTECODE VARCHAR(40)
DECLARE @CURRDATE VARCHAR(40)
DECLARE @UseDate_TJ_END  VARCHAR(20)
BEGIN TRANSACTION
SET @Error_Var = 0
SET @CURRDATE =  CONVERT(VARCHAR(6),GETDATE(),12) + REPLACE(CONVERT(VARCHAR(8),GETDATE(),8),':','')
set @i=(select COUNT(*) from TeleUser where telecode in (select telecode from User_Limit where LimitWay=1) )
while (@i>0)
begin
set @telecode=(select top 1 tu.TeleCode from (select top (@i) telecode from TeleUser where telecode in 
(select telecode from User_Limit where LimitWay=1) order by telecode asc) tu order by tu.TeleCode desc)
set @year=(select MAX(cyear) from Account where ClearFlag=6 and TeleCode=@telecode)
set @month=(select MAX(CMonth) from Account where ClearFlag=6 and TeleCode=@telecode)
set @paydate=(select MAX(PayDate) from PayWaste where TeleCode=@telecode)
set @currpretotal=(select currpretotal from PayWaste where PayDate=@paydate and TeleCode=@telecode)
set @currlevel=(select CurrLevel from User_Limit where TeleCode=@telecode)
set @UseDate_TJ_END=(SELECT  convert(varchar(10),dateadd(mm,T.SETUPNUM,t.UseDate15),120) UseDate_TJ_END
  FROM TELEUSER T,USER_MONEY U 
  WHERE T.TELECODE = U.TELECODE AND T.USEDATE15 IS NOT NULL and T.SETUPNUM  IS NOT NULL and 
  t.telecode=@telecode)
。。。。。。后面省略
在sql2008管理器里编译通过,在sql2000里编译报错,报错的地方显示在以下语句

set @telecode=(select top 1 tu.TeleCode from (select top (@i) telecode from TeleUser where telecode in 
(select telecode from User_Limit where LimitWay=1) order by telecode asc) tu order by tu.TeleCode desc)

报错的解释是“
消息 170,级别 15,状态 1,过程 cleartele,第 28 行
第 28 行: '(' 附近有语法错误。
消息 170,级别 15,状态 1,过程 cleartele,第 29 行
第 29 行: ')' 附近有语法错误。

麻烦高人告诉我哪里错了。2008不是对的嘛。是不是top (@i)的写法? SQL
[解决办法]

引用:
Quote: 引用:


set @telecode=(select top 1 tu.TeleCode 
from (select top (@i) telecode 
from TeleUser where telecode IN (select telecode 
from User_Limit 
where LimitWay=1) 
order by telecode asc) tu 
order by tu.TeleCode desc) A --这个地方少了一个A

不行的。在2000管理器里还是报那个错。我查网上好像说2000不支持top加参数,必须定义一个参数先把语句接下来,然后exec执行,我试了,可以通过,如下
 DECLARE @sqlstr NVARCHAR(200)
 set @sqlstr='(select top 1 tu.TeleCode from (select top ('+CAST(@i AS VARCHAR(10)) + ') telecode from TeleUser where telecode in (select telecode from User_Limit where LimitWay=1) order by telecode asc) tu order by tu.TeleCode desc)'
但这样我telecode怎么赋值啊



2000 top后面加变量需要使用动态的参数。

set @tele = 'select top '+cast(@i as varchar)+' * from TB'

类似这样! 我这儿没有2000环境,没法给你测试,lz自己试一下 。

热点排行
Bad Request.