2014-04-08 54 views
0

我的任務是修復現有存儲過程中的一些問題,這些問題將SELECT和JOIN語句集中到字符串中以便插入具有單個「數據」列的表中。縮短SQL數據字符串中的長替換函數

我在SQL Server Manager 2008 R2中工作。

我從另一個數據庫中的表(SourceTable)中提取數據,SourceTable中的一列(SourceDataColumn)可能包含以下代碼中的任何一個:A,B,C,D或E.添加了幾個REPLACE語句,以便A = 01,B = 02和C,D或E = 03。正如您從代碼中看到的(Stored Proc爲了清晰起見大大縮短),我必須多次使用REPLACE關鍵字在同一行。 C,D和E有單獨的REPLACE,但是必須以某種方式以更簡潔的方式組合C,D和E替代品?

有沒有辦法縮短這段代碼,或者減少冗餘?請記住,我不得不在字符串變量中編寫這個腳本,所以至少對我來說,語法似乎比編寫常規查詢sANS INSERT更棘手。

SET @SQLScript= 
    'INSERT INTO FOO_BAR_Data 
    ( 
    PrimaryId 
    ,Data 
    ) 
    SELECT DISTINCT 

+ISNULL(LTRIM(RTRIM(CONVERT(CHAR(2),  


(REPLACE(REPLACE(REPLACE 

(REPLACE(REPLACE(SomeTable.DataColumn,''A'',''01''),''B'',''02''), 
''C'',''03''),''D'',''03''),''E'',''03''))))),'''') 

LEFT JOIN dbo.FOO_BAR_Mapping v ON v.Foo_promo_code=BarV.promocode 

    Where Info.Startdate >= 
CONVERT(CHAR(20),DATEADD (WEEK , -1, GETDATE()),106)' 

    Execute (@SQLScript) 

回答

1

使用case語句來代替那些許多replace功能。 嘗試像下面代替

select 
case when DataColumn = 'A' then '01' 
when DataColumn = 'B' then '02' 
else '03' end as DataColumn_Formatted 
from 
(
select distinct 
BarV.DataColumn 
from SomeTable BarV 
LEFT JOIN 
FOO_BAR_Mapping v 
ON v.Foo_promo_code=BarV.promocode 
Where Info.Startdate >= 
CONVERT(CHAR(20),DATEADD (WEEK , -1, GETDATE()),106) 
) tab 
+0

謝謝。添加到相當複雜的INSERT INTO字符串時,語法不同,但使用CASE語句有效。 – Hotelsinger