[英]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.