Sql 如何摆脱光标并使用带选择的更新

Sql 如何摆脱光标并使用带选择的更新,sql,sql-server,tsql,Sql,Sql Server,Tsql,我相信这段代码中使用的游标是导致一些主要性能问题的原因,但是我对TSQL是新手 以下脚本在SQLServer2008上运行。我正试图重做它,所以我使用了JOIN语句,但是我没有成功地这样做 DECLARE AIRAMSDET CURSOR FOR SELECT BILL, RECIEPT, NAME FROM Client_Table WHERE IsProcessed = 1 AND TYPE IN ('Sub','First_Time','Old') AND LEN(BILL) >

我相信这段代码中使用的游标是导致一些主要性能问题的原因,但是我对TSQL是新手

以下脚本在SQLServer2008上运行。我正试图重做它,所以我使用了JOIN语句,但是我没有成功地这样做

DECLARE AIRAMSDET CURSOR FOR
SELECT BILL, RECIEPT, NAME
FROM Client_Table
WHERE IsProcessed = 1 
AND TYPE IN ('Sub','First_Time','Old') AND LEN(BILL) > 1

OPEN AIRAMSDET
FETCH AIRAMSDET into @VARBILL, @VARRECIEPT, @VARNAME
WHILE @@Fetch_Status = 0
BEGIN
    UPDATE archieve
    SET entry = left(@VARBILL + '- '+ @VARNAME)
    WHERE archiveID = @VARBILL
END

它应该像下面这样

UPDATE ARCHIEVE
    SET ENTRY = CT.BILL + '-' + CT.NAME
FROM CLIENT_TABLE CT
WHERE 
        ARCHIEVE.ARCHIVEID = CT.BILL
    AND CT.ISPROCESSED = 1 
    AND CT.TYPE IN ('Sub','First_Time','Old') AND LEN(BILL) > 1

我没有包括LEFT(),因为它在查询中的用法不太清楚。在传递@VARNAME时,Left将整数\表达式作为其第二个参数,该参数很可能是VARCHAR。请添加您认为合适的内容。

由于循环中没有
获取
,因此它将长时间处理同一行。