我正在嘗試更新更新查詢位于 while 回圈中的 SQL 行。
DECLARE @Sayac INT
SET @Sayac= (select count(ABBREVIATION) from [MSTR_MD].[dbo].[v_OpcoGeneral_UserList])
WHILE (@Sayac>0)
BEGIN
PRINT @Sayac;
(select ABBREVIATION FROM [MSTR_MD].[dbo].[v_OpcoGeneral_UserList] WHERE [MSTR_MD].[dbo].[v_OpcoGeneral_UserList].ID = @Sayac)
UPDATE [dwh].[dbo].[opco_securty]
SET opco_general = REPLACE(opco_general, (select ABBREVIATION FROM [MSTR_MD].[dbo].[v_OpcoGeneral_UserList] WHERE [MSTR_MD].[dbo].[v_OpcoGeneral_UserList].ID = @Sayac), '')
SET @Sayac = @Sayac - 1
END
但是在這個查詢中,它沒有按預期作業。我想 while 回圈不像在編程語言中那樣被編譯。你能推薦一個解決方案嗎?謝謝!
基本上,例如,如果從視圖中收到“Ugurcan.Kaya”,則從 opco_securty 表的 opco_general(文本)列中洗掉“Ugurcan.Kaya”。

uj5u.com熱心網友回復:
我認為您可以使用遞回 CTE 在沒有回圈的情況下做您想做的事情。我從這篇文章中借用了這個想法在 SQL Server 2005 中的單個更新陳述句中的字串中的多個替換
我安排了它,以便我相信它適用于您的用例。第一個 CTE 使用遞回繼續應用替換,直到不再存在匹配項。
第二個 CTE 用于標識發生的每個遞回替換的 row_number。我們感興趣的 row_number 是securty表中每個字串的最高 row_number ,因為它將包含所有必需的替換。
最后,我們運行一個更新陳述句,securty用適當的替換字串更新表中的每條記錄。
這是我為完成這項作業而撰寫的代碼,包括示例資料和表格:
CREATE TABLE UserList(
id int,
abbr varchar(25)
);
CREATE TABLE securty(
id int,
genrl varchar(250)
);
INSERT INTO UserList(id, abbr)
VALUES(1, 'Ugurcan.Kaya');
INSERT INTO UserList(id, abbr)
VALUES(2, 'User5');
INSERT INTO UserList(id, abbr)
VALUES(3, 'User6');
INSERT INTO securty(id, genrl)
VALUES(1, 'User1-User2-Ugurcan.Kaya-Lorum-User5-User16-User17');
INSERT INTO securty(id, genrl)
VALUES(2, 'User5-Ugurcan.Kaya-Lorum-User5-User16-User17');
;With Replacements as (
SELECT
s.id, s.genrl, 0 AS repcount
FROM
securty AS s
UNION ALL
SELECT
rs.id, CAST(REPLACE(genrl, ul.abbr, '') AS VARCHAR(250)),rs.repcount 1
FROM
Replacements rs
JOIN
UserList ul ON CHARINDEX(ul.abbr,rs.genrl) > 0
),
Final_Replacements AS (
SELECT
rs.id, rs.genrl, ROW_NUMBER() OVER (PARTITION BY rs.id ORDER BY rs.repcount DESC) AS rn
FROM
replacements AS rs
)
UPDATE s
SET s.genrl = fs.genrl
FROM securty AS s
JOIN Final_Replacements AS fs
ON fs.id = s.id AND fs.rn = 1
我還創建了一個 sqlfiddle 供您試用:http ://sqlfiddle.com/#!18/904e0/1/0
uj5u.com熱心網友回復:
小提琴
也許這將有助于理解在UPDATE陳述句中將一組替換模式應用于目標表的一種方法。
只是為了澄清,REPLACE將替換字串中所有匹配的匹配項,如上一個示例字串中所示...'6this is XYZ another XYZ test'更新為'6this is another test'.
從 t-sql 檔案:
替換 (Transact-SQL)
用另一個字串值替換所有出現的指定字串值。
SQL:
UPDATE test
SET test.data = REPLACE(data, pattern, '')
FROM test
JOIN abbrev
ON test.data LIKE CONCAT('%', pattern, '%')
;
設定:
CREATE TABLE test ( id int, data varchar(40) );
INSERT INTO test VALUES
( 1, '1this is a NameToRemove test' )
, ( 2, '2this is a NameToNotRemove test' )
, ( 3, '3this is another NameXToRemove test' )
, ( 4, '4this is another NameXToRemove test' )
, ( 5, '5this is another NameXToRemove test' )
, ( 6, '6this is XYZ another XYZ test' )
;
CREATE TABLE abbrev ( id int, pattern varchar(20) );
INSERT INTO abbrev VALUES
( 1, 'NameToRemove' )
, ( 2, 'NameXToRemove' )
, ( 3, 'NameZToRemove' )
, ( 4, 'XYZ' )
;
資料:
| ID | 資料 |
|---|---|
| 1 | 1這是一個 NameToRemove 測驗 |
| 2 | 2這是一個 NameToNotRemove 測驗 |
| 3 | 3這是另一個 NameXToRemove 測驗 |
| 4 | 4這是另一個 NameXToRemove 測驗 |
| 5 | 5這是另一個 NameXToRemove 測驗 |
| 6 | 6這是XYZ另一個XYZ測驗 |
結果:
| ID | 資料 |
|---|---|
| 1 | 1這是一個測驗 |
| 2 | 2這是一個 NameToNotRemove 測驗 |
| 3 | 3這是另一個測驗 |
| 4 | 4這是另一個測驗 |
| 5 | 5這是另一個測驗 |
| 6 | 6這是另一個測驗 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/395959.html
標籤:sql sql-server 循环
