2012-12-14 9 views
5

mam tę tabelę terazJak zaktualizować kolumnę za pomocą parametru Numer_wiersza o innej wartości dla każdego wiersza?

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] 
) 

muszę zaktualizować Kolumna IdDatoLegal. W tej chwili mam 80 wierszy na tym stole, więc muszę zaktualizować każdy wiersz o numerach 1, 2, 3 ... 79, 80.

Próbowałem proste kwerendy do procedur przechowywanych bez powodzenia w ogóle.

Mam tę procedurę przechowuje teraz:

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 

Zwraca tę wiadomość, kiedy go uruchomić

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

myślę, że to dlatego, że w podzapytania (SELECT ROW_NUMBER() OVER (ORDER BY IdCliente) AS RowNum FROM DatosLegales) zwraca 80 wierszy, w których powinien zwracać tylko jeden (ale za każdym razem powinien to być inny numer:

Czy wiesz, co muszę dodać do podzapytanie, aby działało? a przede wszystkim czy pętla i reszta procedury są prawidłowe?

góry dzięki

+0

używasz SQL Server? – luchosrock

+0

@luchosrock - Składnia, ograniczniki nawiasu kwadratowego i komunikat o błędzie wskazują SQL Server (chociaż prawdopodobnie Sybase, jeśli ma te same komunikaty o błędach, jak przypuszczam). –

Odpowiedz

18

można zaktualizować wszystkie wiersze w jednej instrukcji przy użyciu CTE jak poniżej.

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

Nieco mylić: Czy ta aktualizacja 'DatosLegales'? – Kaf

+1

Tak. CTE działa jak widok aktualizowalny i jest ponownie tłumaczony na aktualizację w kolumnie tabeli podstawowej. –

+0

Dobrze wiedzieć. Czy ta aktualizacja mówi: 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

Nie ma potrzeby dołączania na stół bazowy. Plan jest mniej wydajny, ponieważ dodaje łączenie i szpulę. –

+0

Ah w porządku, właśnie zadałem podobne pytanie w inny sposób. Twoja odpowiedź nieco mnie zdezorientowała. – Kaf

Powiązane problemy