gpt4 book ai didi

sql - 如何通过 Row_Number 更新列,并为每一行使用不同的值?

转载 作者:行者123 更新时间:2023-12-02 21:26:37 24 4
gpt4 key购买 nike

我现在有这张 table

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 行,而它应该只返回 1 行(但每次都应该是不同的数字。

你知道我必须在子查询中添加什么才能使它工作吗?最重要的是,循环和程序的其余部分正确吗?

提前致谢

最佳答案

您可以使用 CTE 更新一条语句中的所有行,如下所示。

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

关于sql - 如何通过 Row_Number 更新列,并为每一行使用不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13884011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com