2015-05-17 35 views
1

如果我在SQL服務器執行下面的SQL語句的查詢2008年,它完美的作品,但是當SQL Server 2000中執行同一語句,這是行不通的:SQL 2000 is'not執行,2008年可以執行

聲明:在SQL Server 2000

select top 1 
    [k].[FixbiUnitPrice] 
from (
    select top (select COUNT(*) 
       from [dbo].[mnrFnBI_Fixed]('4E591E71-33BD-4ECC-8703-771BE8A76817') f) 
    [FixbiUnitPrice], 
    BDate, 
    biNumber 
    From [dbo].[mnrFnBI_Fixed]('4E591E71-33BD-4ECC-8703-771BE8A76817') f 
    where f.BAccCustID != 0x0 
    order by f.BDate desc,f.BNumber desc,f.biNumber desc 
) [k] 

輸出:

Server: Msg 170, Level 15, State 1, Line 1 
Line 1: Incorrect syntax near '('. 
Server: Msg 170, Level 15, State 1, Line 1 
Line 1: Incorrect syntax near 'FixbiUnitPrice'. 

這有什麼錯的語法爲SQL Server 2000

+0

它不起作用。頂部x表達式不能是動態的。 –

+0

感謝您的快速重播,所以我如何解決上述語句與SQL 2000工作?!可以做什麼其他方式?! –

+0

我不確定SQL Server 2000的問題,但試着將'TOP'計算成變量,然後在查詢中使用變量。 'DECLARE @n INT SET @n =(SELECT COUNT(*)FROM ...)... SELECT TOP(@n)...' –

回答

1

從2005年開始,在sql server中支持'dynamic'top。 對於sql server 2000,你只能在top之後使用一個常數。 您可以使用SET ROWCOUNT進行查詢。

Also, Read this post and it's answers.

+0

感謝解決問題的很多。 –

+0

很高興幫助!請接受答案,以便其他人知道問題已解決。 –

1

除了@瑣的觀點,即一個變量TOP @N不能在SQL 2000的支持,你也可以做的是產生動態SQL,然後執行,即:

DECLARE @TopCount INT 
DECLARE @Sql NVARCHAR(2000) 

SELECT @TopCount = COUNT(*) 
FROM [dbo].[mnrFnBI_Fixed]('4E591E71-33BD-4ECC-8703-771BE8A76817') 

SET @Sql = 
'select top 1 
    [k].[FixbiUnitPrice] 
from (
    select top ' + CONVERT(NVARCHAR(50), @TopCount) + ' 
    [FixbiUnitPrice], 
    BDate, 
    biNumber 
    From [dbo].[mnrFnBI_Fixed](''4E591E71-33BD-4ECC-8703-771BE8A76817'') f 
    where f.BAccCustID != 0x0 
    order by f.BDate desc,f.BNumber desc,f.biNumber desc 
) [k]' 

EXEC sp_executesql @Sql 

也就是說,Sql 2000實際上是一個不受支持的遺留技術,您需要考慮儘快升級到更新版本的Sql Server。

+0

約2000不支持的好點。但是,我會小心的建議使用動態sql而不提及sql注入。 –

+0

@Zohar在處理來自不可信用戶輸入的字符串數據時,你是正確的,但是你會注意到1)'@ TopCount'是一個強類型的INT,而不是一個字符串,2)'@ TopCount'是由我們自己在上面的行中得出的。所以在這種情況下,不要害怕。 – StuartLC

+0

我接受。但是,大多數人在將它引入到stackoverflow時往往會簡化問題,因此OP所需的實際查詢很可能包含用戶提供的一些變量。此外,peopel傾向於採取一種解決方案,並將其擴展到其他方面,意味着OP可能會嘗試將一些其他語句轉換爲動態sql。這就是爲什麼每當我提到使用動態sql的可能性的時候,我還會提到一些小鮑比表。 –