[英]How to update a column via Row_Number with a different value for each row?
我現在有這張桌子
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行,它應該只返回一行(但每次它應該是一個不同的數字。
你知道我必須添加到子查詢以使其工作嗎? 最重要的是,循環和程序的其余部分是正確的嗎?
提前致謝
您可以使用CTE更新一個語句中的所有行,如下所示。
;WITH T
AS (SELECT IdDatoLegal,
Row_number() OVER (ORDER BY IdCliente ) AS RN
FROM dbo.DatosLegales)
UPDATE T
SET IdDatoLegal = RN
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.