簡體   English   中英

使用 SQL Cursor 更新表

[英]Update Table using SQL Cursor

我正在嘗試使用 cursor 更新表中的字段,但更新沒有發生,我不知道為什么。 這是我的 SQL 查詢:

DECLARE @EmployeeCompanyId int

SELECT DISTINCT  EmployeeCompanyId
FROM [dbo].[tbl_Company_Employee_Contacts]


OPEN MY_CURSOR

FETCH NEXT FROM MY_CURSOR INTO @EmployeeCompanyId

WHILE @@FETCH_STATUS = 0
BEGIN 
    UPDATE [dbo].[tbl_Company_Employee_Contacts]
    SET City = (SELECT TOP 1 Phone 
                FROM [dbo].[tbl_Company_Employee_Contacts]
                WHERE EmployeeCompanyId = @EmployeeCompanyId 
                 AND City IS NOT NULL)
    WHERE EmployeeCompanyId = @EmployeeCompanyId 
       AND City IS NOT NULL

    FETCH NEXT FROM MY_CURSOR INTO @EmployeeCompanyId
END

CLOSE MY_CURSOR

表是用每條記錄的一條聯系信息創建的。 我正在嘗試將所有信息合並到一個記錄中,以便我可以刪除其他記錄:

在此處輸入圖像描述

您可以做的事情如下。 您沒有提供任何具體的樣本數據和所需的結果,所以這只是一個模型,但應該給您一些可以使用的東西,並且看不到cursor

/* sample data */
create table T (id int, EmployeeCompanyId int, Phone varchar(20), Street varchar(50))
insert into T values
(1,     10,'1234567890', null),
(1202,  10,'1234567890', null),
(78086, 10, null, 'Larose'),
(144887,10, null, 'Larose')

select * from T;

/* Update the highest ID row for each employee with data for each column*/
with u as (
    select Max(Id) Id, Max(Phone) Phone, Max(Street) Street
    from T
    group by EmployeeCompanyId
)
update t set
    t.phone=u.phone,
    t.street=u.street
from u
join T  on t.Id=u.Id

select * from T

/* delete all redundant rows for each employee */
/* This keeps the highest ID, if you want to put all data on the lowest ID, reverse the criteria accordingly */


with u as (
select EmployeeCompanyId, id, Row_Number() over (partition by EmployeeCompanyId order by id desc) rn
from t
)
delete from t
from u join t on t.Id=u.Id
where u.rn>1

select * from T

正如其他人在評論中所說,我不知道為什么這里甚至需要CURSOR 但是您上面的代碼的問題是您沒有在最初的DECLARE中首先SELECT CURSOR

DECLARE @EmployeeCompanyId int

DECLARE MY_CURSOR CURSOR FOR
    SELECT DISTINCT  EmployeeCompanyId
    FROM [dbo].[tbl_Company_Employee_Contacts]


OPEN MY_CURSOR

FETCH NEXT FROM MY_CURSOR INTO @EmployeeCompanyId

WHILE @@FETCH_STATUS = 0
BEGIN 
    UPDATE [dbo].[tbl_Company_Employee_Contacts]
    SET City = (SELECT TOP 1 Phone 
                FROM [dbo].[tbl_Company_Employee_Contacts]
                WHERE EmployeeCompanyId = @EmployeeCompanyId 
                 AND City IS NOT NULL)
    WHERE EmployeeCompanyId = @EmployeeCompanyId 
       AND City IS NOT NULL

    FETCH NEXT FROM MY_CURSOR INTO @EmployeeCompanyId
END

CLOSE MY_CURSOR

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM