2012-12-14 15 views
5

Ich habe diese Tabelle jetztWie aktualisiert man eine Spalte über Row_Number mit einem anderen Wert für jede Zeile?

CREATE TABLE [dbo].[DatosLegales](
    [IdCliente] [int] NOT NULL, 
    [IdDatoLegal] [int] NULL, 
    [Nombre] [varchar](max) NULL, 
    [RFC] [varchar](13) NULL, 
    [CURP] [varchar](20) NULL, 
    [IMSS] [varchar](20) NULL, 
    [Calle] [varchar](100) NULL, 
    [Numero] [varchar](10) NULL, 
    [Colonia] [varchar](100) NULL, 
    [Pais] [varchar](50) NULL, 
    [Estado] [varchar](50) NULL, 
    [Ciudad] [varchar](50) NULL, 
    [CodigoPostal] [varchar](10) NULL, 
    [Telefono] [varchar](13) NULL, 
    [TipoEmpresa] [varchar](20) NULL, 
    [Tipo] [varchar](20) NULL, 
CONSTRAINT [PK_DatosLegales] PRIMARY KEY CLUSTERED 
(
    [IdCliente] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) 

Ich brauche die IdDatoLegal Spalte zu aktualisieren. Im Moment habe ich 80 Zeilen auf dieser Tabelle, also muss ich jede Zeile mit den Nummern 1, 2, 3 ... 79, 80 aktualisieren.

Ich habe versucht, einfache Abfragen zu gespeicherten Prozeduren ohne Erfolg überhaupt.

Ich habe dieses Shops Verfahren jetzt:

ALTER PROCEDURE dbo.ActualizarDatosLegales 
@RowCount int 
AS 
DECLARE @Inicio int 
SET @Inicio = 0 
WHILE @Inicio < @@RowCount 
SET @Inicio += 1; 
BEGIN 
UPDATE DatosLegales SET IdDatoLegal = @Inicio WHERE (SELECT ROW_NUMBER() OVER (ORDER BY IdCliente) AS RowNum FROM DatosLegales) = @Inicio; 
END 

Es gibt diese Meldung, wenn ich es laufen

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

Ich denke, das ist, weil in der Unterabfrage (SELECT ROW_NUMBER() OVER (ORDER BY IdCliente) AS rownum VON DatosLegales) es 80 Zeilen zurückgibt, wo es nur eine zurückkehren sollte (aber jedes Mal, sollte es eine diferent Zahl sein.

wissen Sie, was ich hinzufügen müssen die Unterabfrage, damit es funktioniert? und vor allem, ist die Schleife und der Rest der Prozedur richtig?

Dank im Voraus

+0

verwenden Sie SQL Server? – luchosrock

+0

@luchosrock - Die Syntax, eckige Klammer Begrenzer und Fehlermeldung zeigen SQL Server (obwohl möglicherweise Sybase, wenn das die gleichen Fehlermeldungen hat, nehme ich an). –

Antwort

18

Sie alle Zeilen in einer Anweisung aktualisieren können, wie unten einen CTE verwenden.

;WITH T 
    AS (SELECT IdDatoLegal, 
       Row_number() OVER (ORDER BY IdCliente) AS RN 
     FROM dbo.DatosLegales) 
UPDATE T 
SET IdDatoLegal = RN 
+0

Etwas verwirrt: Ist dieses Update 'DatosLegales'? – Kaf

+1

Ja. Das CTE verhält sich ähnlich wie eine aktualisierbare Sicht und es wird wieder in ein Update in der Basistabellenspalte übersetzt. –

+0

Das ist schön zu wissen. Gibt es in diesem Update auch IdCliente = 56, IdDatoLegal = 56 (RN).? – Kaf

5
UPDATE D 
SET IdDatoLegal = RN 
FROM DatosLegales D JOIN 
(
    SELECT IdCliente, Row_number() OVER (ORDER BY IdCliente) AS RN 
    FROM DatosLegales 
) Temp 
ON D.IdCliente = Temp.IdCliente 
+0

Es besteht keine Notwendigkeit für eine Rückverbindung auf den Basistisch. Der Plan hierfür ist weniger effizient, da die Verbindung und eine Spool hinzugefügt werden. –

+0

Ah, okay, ich habe die ähnliche Frage anders herum gestellt. Deine Antwort hat mich verwirrt. – Kaf

Verwandte Themen