2012-12-14 4 views
5

У меня есть эта таблица прямо сейчасКак обновить столбец через Row_Number с другим значением для каждой строки?

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

мне нужно обновить столбец IdDatoLegal. Прямо сейчас у меня есть 80 строк на этой таблице, поэтому мне нужно обновить каждую строку с номерами 1, 2, 3 ... 79, 80.

Я пробовал простые запросы к хранимым процедурам без каких-либо успехов.

У меня есть эта процедура хранит прямо сейчас:

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 

возвращает это сообщение, когда я запустить его

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

Я предполагаю, что это потому, что в подзапрос (SELECT row_number() OVER (ORDER BY IdCliente) AS RowNum FROM DatosLegales), он возвращает 80 строк, где он должен только возвращать один (но каждый раз он должен быть разным числом.

Знаете ли вы, что мне нужно добавить в подзапрос, чтобы заставить его работать? и, прежде всего, правилен ли цикл и остальная процедура?

заранее спасибо

+0

вы используете SQL Server? – luchosrock

+0

@luchosrock. Синтаксис, разделители квадратной скобки и сообщение об ошибке указывают на SQL Server (хотя, возможно, Sybase, если у этого есть те же сообщения об ошибках, которые я предполагаю). –

ответ

18

Вы можете обновить все строки в одном операторе, используя КТР, как показано ниже.

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

Немного путайте: Это обновление 'DatosLegales'? – Kaf

+1

Да. CTE действует как обновляемое представление, и оно возвращается к обновлению в столбце базовой таблицы. –

+0

Это приятно знать. Кроме того, говорит ли это обновление, 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

Нет необходимости в регистрации на базовую таблицу. План для этого менее эффективен, так как он добавляет соединение и катушку. –

+0

О, хорошо, я просто задал аналогичный вопрос по-другому. Ваш ответ немного смутил меня. – Kaf

 Смежные вопросы

  • Нет связанных вопросов^_^