2012-12-14 16 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. 

मुझे लगता है कि क्योंकि सबक्वेरी में (चयन ROW_NUMBER() से अधिक (द्वारा आदेश की IdCliente) DATOSLegales से AS RowNum) यह 80 पंक्तियों को लौटाता है जहां इसे केवल एक लौटाया जाना चाहिए (लेकिन प्रत्येक बार यह एक अलग संख्या होना चाहिए।

क्या आपको पता है कि मुझे क्या जोड़ना है यह काम करने के लिए subquery? और सब से ऊपर, लूप और शेष प्रक्रिया सही है?

धन्यवाद अग्रिम

+0

आप एसक्यूएल सर्वर का उपयोग कर रहे हैं? – luchosrock

+0

@ लूचोसॉक - सिंटैक्स, स्क्वायर ब्रैकेट डिलीमीटर, और त्रुटि संदेश SQL सर्वर इंगित करता है (यद्यपि संभवतः साइबेस यदि उसके पास एक ही त्रुटि संदेश है तो मुझे लगता है)। –

उत्तर

18

में आप एक बयान के रूप में नीचे एक CTE का उपयोग कर में सभी पंक्तियों को अद्यतन कर सकते हैं।

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

थोड़ा उल उलझन में: क्या यह अद्यतन 'डेटोसलेगल्स' है? – Kaf

+1

हां। सीटीई एक अद्यतन करने योग्य दृश्य की तरह कुछ कार्य करता है और इसे आधार तालिका कॉलम पर अपडेट में वापस अनुवादित किया जाता है। –

+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

संबंधित मुद्दे

 संबंधित मुद्दे