2009-08-17 11 views
0

Ich habe eine ID-Spalte in dieser Ansicht, aber es springt von 40.000 auf 7.000.000. Ich möchte nicht, dass meine verrückte gespeicherte Prozedur eine Schleife ausführt, bis sie 7.000.000 erreicht, also habe ich mich gefragt, ob ich eine Spalte erstellen könnte, die die Zeilennummer war. Es wäre ein Ausdruck irgendeiner Art, aber ich weiß nicht, wie ich es machen soll. Bitte helfen! Vielen Dank im Voraus.Ist es möglich, eine Ausdrucksspalte in einer Ansicht zu erstellen, um die Zeilennummer anzuzeigen?

+0

, die Code-Block Mist einfügen nicht – Marlon

+0

funktioniert es funktioniert gut. – skaffman

+0

danke. jetzt hilfe meh pls lol. – Marlon

Antwort

0

Relationale Tabellen haben keine Zeilennummern. Sie können eine Zeilennummer in ein Ergebnis projizieren, indem Sie die integrierte Funktion ROW_NUMBER() OVER (ORDER BY ...) verwenden.

Ihr Verfahren hat viele, viele Probleme. Es verwendet loop @counter als Suchschlüssel (!!!). Es wird die Schlüsselstabilität zwischen den Iterationen vorausgesetzt (z. B. wird angenommen, dass @ counter + 1 der nächste Schlüssel ist, wobei alle möglichen Einfügungen/Löschungen ignoriert werden). Es nimmt Stabilität innerhalb der Schleife an (keine Transaktionen, kein Sperren, um die Gültigkeit von EXISTS zu gewährleisten).

Versuchen Sie, einen Keyset-Cursor zu emulieren. Verwenden Sie einfach einen Keyset-Cursor.

0

Sie sollten wirklich tun, was Sie mit Updates tun, nicht Schleifen. Aber wenn Sie darauf bestehen ...

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 

Stellen Sie sicher, dass die ID-Spalte indiziert ist. Dies ermöglicht das Überspringen der nicht sequentiellen Id-Werte.

Es sieht so aus, als ob die Verarbeitung, die Sie tun, mit Update-Anweisungen behandelt werden könnte. Das wäre viel effizienter und beseitigt viele der Probleme, die andere aufgeworfen haben.

0

Wenn Sie können, versuchen Sie, die gespeicherte Prozedur neu zu schreiben, um Sätze im Vergleich zu zeilenbasierter Verarbeitung zu verwenden.

Um zu tun, was Sie brauchen, verwenden Sie die ROW_NUMBER-Funktion. Um dies zu tun, habe ich unten einen Beispielcode zur Verfügung gestellt.

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 
Verwandte Themen