這裏是另一種選擇&更換。這個過程將基本上「標記」字符串以避免衝突。
我要指出,該縮寫將最好的是兩個字段(發件人,收件人)。提供的樣本中的一對似乎不一致(Long> Short和Short to Long)。
Declare @Table1 table (ID int,Description varchar(500));Insert into @Table1 values (1,'HOUSING,WRAP RECESSED'),(2,'HOUSING,ASSEMBLY 2-FEED'),(3,'LENS,FLUSH SUS')
Declare @Table2 table (MapFrom varchar(50),MapTo varchar(50));Insert Into @Table2 values
('ASSEMBLY','ASSY'),
('FEED' ,'FD'),
('FLUSH' ,'FL'),
('HOUSING' ,'HSG'),
('LENS' ,'LNS'),
('RECESSED','REC')
Declare @SQL varchar(max)=''
Select @SQL = @SQL+concat(',(',ID,',''||',replace(Description,'''',''''''),'||'')') From @Table1 --Where ID=2
Select @SQL = Replace(@SQL,MapFrom,MapTo)
From (
Select MapFrom=' ',MapTo='|| ||'
Union All
Select ',','||,||'
Union All
Select '-','||-||'
Union All
Select MapFrom = '||'+ltrim(rtrim(MapFrom))+'||'
,MapTo = ltrim(rtrim(MapTo))
From @Table2
Union All
Select '||','' -- Remove Any Remaining |
) A
Select @SQL = 'Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)'
Exec(@SQL)
返回
ID Value
1 HSG,WRAP REC
2 HSG,ASSY 2-FD
3 LNS,FL SUS
一種方法(不一定是最好的一個)是使用光標去通過表1的每一行,並且應用需要執行的程序執行字符串替換多次來自表2的數據直到不能進行替換。 – uncoder
是否有重疊替換的可能性,例如「FOOD」變成「FD」,「FOO」變成「FU」?如果是這樣,您需要像Cappelletti博士的解決方案,在嘗試替換之前「輸入」輸入字符串。如果替換可以遞歸地發生,則會發生另一些樂趣。 「FOOD WRAP」變成「FD WRP」,「WRP」變成「RP」。你想不斷取代一路? – HABO
@HABO,到目前爲止所有的方法都是*逐行*。鑑於有一個排序順序的替代品,這是沒有問題的。有人甚至可能會將某個短語替換爲其他字詞,並在其他替換後重新替換。在我的其中一個項目中,我們使用了一個帶有兩個參數的函數:帶有所有替換項的A *鍵值對* -XML和'NVARCHAR(MAX)'。我們使用這種方式進行復雜的*多級*操作,以創建模板外的CDA文檔。只要你只處理一個文件,這個工作的速度驚人地快...... – Shnugo