我的任务是修复现有存储过程中的一些问题,这些过程将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)
答案 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