2011-08-11 51 views
0

我正在使用PLC連接到SQL數據庫,並且需要返回值列表。不幸的是,PLC的內存有限,每次只能檢索大約5,000個值,但是數據庫最多可以包含10,000個值。在視圖中對行編號

因此,我需要一種在2個操作中檢索這些值的方法。不幸的是,PLC在它可以執行的查詢中受到限制,並且僅限於SELECT和WHERE命令,所以我不能使用LIMIT或TOP或類似的東西。

有沒有一種方法可以在該視圖中創建視圖並自動編號每個字段?然後我可以查詢所有記錄< 5,000,然後是第二個查詢< 10,000等?

不幸的是,似乎視圖不支持標識列,所以這需要手動完成。

有人有什麼建議嗎?此刻我唯一現實的選擇似乎是創造2次,一個與第一和5000 1對下一個5000 ...

我使用SQL Server 2000中,如果有差別......

回答

0

雖然德里克提供的代碼做什麼,我問 - 即數字在每一行中的觀點,這表現爲真正的窮人 - 大約20秒至100個行。因此,這不是一個可行的解決方案。另一種方法是用前1個數字對前5000個記錄進行編號,然後使用2個下一個5000個記錄。這可以通過3個簡單查詢完成,並且執行起來要快得多。

代碼這樣做如下:

SELECT TOP(5000) BCode, SAPCode, 1 as GroupNo FROM dbo.DB 
UNION 
SELECT TOP (10000) BCode, SAPCode, 2 as GroupNo FROM dbo.DB p 
WHERE ID NOT IN (SELECT TOP(5000) ID FROM dbo.DB) 

雖然,正如舍甫琴科中號指出的那樣,你也應該指定一個明確的排序,以確保您不要錯過任何記錄。

0

有兩種解決方案。最簡單的是修改你的SQL表並添加一個IDENTITY列。如果這不可能,你將不得不做類似於下面的查詢。對於10000行,它不應該太慢。但隨着桌子的增長,它會變得越來越糟糕。

SELECT  Col1, Col2, (SELECT COUNT(i.Col1) 
       FROM yourtable i 
       WHERE i.Col1 <= o.Col1) AS RowID 
FROM   yourtable o 
+0

謝謝Derek,雖然它工作並給它們編號,但需要20秒來在我的測試數據庫上記錄100條記錄,所以對於10,000行來說這不會起作用!相反,我找到了一種方法,以1爲單位對前5000個數字進行編號,然後用另一個2個5000個編號,然後我們可以對其進行查詢。 –

+0

上面提到的代碼如下: 'SELECT TOP(5000)BCODE,SAPCode,1作爲GroupNo FROM dbo.DB 工會 SELECT TOP(10000)BCODE,SAPCode,2作爲GroupNo FROM dbo.DB p 在哪裏ID不在(選擇頂部(5000)ID從dbo。DB)' –

+0

我很高興你找到了一個解決方案 - 你可以把它作爲一個單獨的「答案」發佈並接受你自己的答案,這樣任何遇到這個問題的人都會看到你的最終解決方案。 –

0

一種可能性是使用功能與臨時表如

CREATE FUNCTION dbo.OrderedBCodeData() 
RETURNS @Data TABLE (RowNumber int IDENTITY(1,1),BCode int,SAPCode int) 
AS 
BEGIN 
    INSERT INTO @Data (BCode,SAPCode) 
    SELECT BCode,SAPCode FROM dbo.DB ORDER BY BCode 

    RETURN 
END 

並選擇此功能,如

SELECT FROM dbo.OrderedBCodeData() WHERE RowNumber BETWEEN 5000 AND 10000 

我還沒有在生產中使用過這一點,事實上,今天早上只是一個快速的想法,但值得探索,作爲一個更好的選擇?

+0

感謝賈斯汀 - 聽起來好像可能會奏效,但我們決定採用我在文章中提到的選項。我們正在通過一個PLC對數據庫進行通信,這個PLC對SQL的支持非常有限。我不確定它是否會支持對DB函數的調用。 –