2009-08-17 101 views
0

我在這個視圖中有一個Id列,但它從40,000跳到7,000,000。 我不希望我的瘋狂的存儲過程循環直到它達到7,000,000,所以我想知道如果我可以創建一個列號是行號。這將是某種表達方式,但我不知道如何製作。請協助! 預先感謝您。是否可以在視圖中創建表達式列來顯示行號?

+0

插入代碼塊廢話不起作用 – Marlon 2009-08-17 16:37:38

+0

它工作得很好。 – skaffman 2009-08-17 16:45:23

+0

謝謝。現在幫助我請大聲笑。 – Marlon 2009-08-17 16:54:41

回答

0

關係表沒有行號。您可以使用內置的ROW_NUMBER() OVER (ORDER BY ...)函數將行號投影到結果中。

你的程序有很多很多問題。它使用loop @counter作爲查找鍵(!!!)。它假定迭代之間的密鑰穩定性(即假定@ counter + 1 下一個密鑰,忽略任何concurent插入/刪除)。它假設循環內部是穩定的(沒有交易,沒有鎖定以確保EXISTS的有效性)。

你試圖做的是嘗試模仿鍵集驅動遊標。只需使用鍵集遊標。

0

你真的應該做你正在做的更新,而不是循環。但如果你堅持......

declare @ID int 
declare @LastID int 
select @LastID = 0 

while (1 = 1) 
    begin 
    select @ID = min(Id) 
    from [vCategoryClaimsData] 
    where Id > @LastID 

    -- if no ID found then we've reached the end of the table 
    if @ID is null break 

    -- look up the data for @ID 
    SELECT @claim_Number = dbo.[vCategoryClaimsData].[Claim No],  
    ... 
    where Id = @LastID 


    -- do your processing here 
    ... 


    -- set @LastID to the ID you just processed 
    select @LastID = @ID 

    end 

確保Id列索引。這將允許跳過非順序的Id值。

這就是說,它看起來像你正在做的處理可以用更新語句處理。這樣會更有效率,並消除其他人提出的許多問題。

0

如果可以,請嘗試重寫存儲過程以使用集合與基於行的處理。

要做你所需要的,你將使用ROW_NUMBER函數。爲此,我在下面提供了一些示例代碼。

USE tempdb 
GO 

IF OBJECT_ID('tempdb.dbo.IDRownumbersView') IS NOT NULL 
    DROP VIEW5 dbo.IDRownumbersView 

IF OBJECT_ID('tempdb.dbo.IDRownumbersTable') IS NOT NULL 
    DROP TABLE dbo.IDRownumbersTable 

CREATE TABLE dbo.IDRownumbersTable 
    (
    RowID int PRIMARY KEY CLUSTERED 
    ,CharValue varchar(5) 
    ,DateValue datetime 
    ) 

INSERT INTO IDRownumbersTable VALUES (10, 'A', GETDATE()) 
INSERT INTO IDRownumbersTable VALUES (20, 'B', GETDATE()) 
INSERT INTO IDRownumbersTable VALUES (30, 'C', GETDATE()) 
INSERT INTO IDRownumbersTable VALUES (40, 'D', GETDATE()) 
INSERT INTO IDRownumbersTable VALUES (50, 'E', GETDATE()) 
INSERT INTO IDRownumbersTable VALUES (100, 'F', GETDATE()) 
INSERT INTO IDRownumbersTable VALUES (110, 'G', GETDATE()) 
INSERT INTO IDRownumbersTable VALUES (120, 'H', GETDATE()) 
GO 

CREATE VIEW dbo.IDRownumbersView 

AS 

SELECT ROW_NUMBER() OVER (ORDER BY RowID ASC) AS RowNumber 
    ,RowID 
    ,CharValue 
    ,DateValue 
FROM dbo.IDRownumbersTable 
GO 

SELECT * FROM dbo.IDRownumbersView 
相關問題