缩短SQL数据字符串中的长替换函数

时间:2014-04-08 16:26:33

标签: string sql-server-2008 tsql stored-procedures replace

我的任务是修复现有存储过程中的一些问题,这些过程将SELECT和JOIN语句汇集到一个字符串中,以便插入到包含单个“数据”列的表中。

我在SQL Server Manager 2008 R2中工作。

我从另一个数据库中的表(SourceTable)中提取数据,SourceTable中的一个列(SourceDataColumn)可能包含以下任何一个代码:A,B,C,D或E.我有添加了几个REPLACE语句,以便A = 01,B = 02,以及C,D或E = 03.从代码中可以看出(为了清晰起见,存储过程大大缩短了),我必须多次使用REPLACE关键字同一条线。 C,D和E有一个单独的REPLACE,但必须有一些方法以更简洁的方式组合C,D和E替换?

有没有办法缩短此代码,或减少冗余?请记住,我必须在字符串变量中编写此脚本,因此至少对我来说,语法似乎比编写常规查询更加棘手。

    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 个答案:

答案 0 :(得分: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