2017-07-14 69 views
-1

我正在替換臨時表的列的某些文本(掩碼)。我用一列表替換可搜索的文本。如何使用SQL Server進行多個替換 - T-SQL

例子:

SELECT TOP 1000 * 
INTO TEMP_COMPL_L 
FROM TB_CONTRATO 
WHERE IDCAR_CON = 1 

ALTER TABLE TEMP_COMPL_L 
    ADD COMPL_TMP VARCHAR(1500) 

UPDATE TEMP_COMPL_L 
SET COMPL_TMP = '#FIRSTNAME#, URGENTE: Va a sua loja no dia #DATE# e procure o Gerente #MANAGERNAME#.' 

-- GET DATAS FROM MASKS HERE 
UPDATE TEMP_COMPL_L 
SET COMPL_TMP = REPLACE(REPLACE(REPLACE(COMPL_TMP, 
           '#FIRSTNAME#', LEFT(NOME_CLI, CHARINDEX(' ',NOME_CLI)-1)), 
           '#MANAGERNAME#', ISNULL(CONTT_LOJ,'')), 
           '#DATE#', CONVERT(VARCHAR(10), GETDATE(), 103) 
    ) 
FROM TEMP_COMPL_L 
INNER JOIN TB_CLIENTE ON IDCLI_TMP = IDCLI_CLI 
LEFT JOIN TB_LOJA ON IDLOJ_TMP = IDLOJ_LOJ 

它完美的作品這樣,不過,我需要爲客戶端通知20多個可能的面具做到這一點,以面具和給予更換爲的價值表LOJA和CLIENTE中的相應列。

有沒有更好的表現和明顯的可讀性的方法?因爲幾次替換會非常困惑。除了在SQL Server中允許替換的限制之外。

+3

嵌套替換速度非常快,並且您可以使用的編號沒有限制。將其格式化的格式可能會變得很具挑戰性,但看起來您已經有了一個很好的模式。 –

+0

我以爲我有一個嵌套的限制。我會這樣看的。 – Luiz

回答

0

無法獲得比嵌套替換更好的性能。

如果您想使其更具可讀性,您可以將替換置於UDF中,但這可能會導致性能下降。

+0

我想象通過功能來做它會失去表現。我不能同時擁有,性能和可讀性.. :( – Luiz

0

對於性能,可能沒有比使用嵌套替換更好的解決方案。但爲了便於閱讀,您可以重寫如下

SELECT TOP 1000 * 
INTO TEMP_COMPL_L 
FROM TB_CONTRATO 
WHERE IDCAR_CON = 1 

ALTER TABLE TEMP_COMPL_L 
    ADD COMPL_TMP VARCHAR(1500) 

DECLARE @date VARCHAR(10) 
SELECT @date = CONVERT(VARCHAR(10), GETDATE(), 103) 

-- GET DATAS FROM MASKS HERE 
;With DataMask AS 
(
    SELECT T.IDCLI_CLI 
      ,ISNULL(T.NOME_CLI,'#FIRSTNAME#')  as First_Name 
      ,ISNULl(L.CONTT_LOJ,'#MANAGERNAME#') as Manager_Name 
    FROM  TB_CLIENTE T 
    LEFT JOIN TB_LOJA  L 
    ON   T.IDLOJ_TMP = L.IDLOJ_LOJ 
) 

UPDATE TMP 
SET  COMPL_TMP = D.First_Name + ', URGENTE: Va a sua loja no dia ' + @date + ' e procure o Gerente ' + Manager_Name + '.' 
FROM TEMP_COMPL_L TMP 
JOIN DataMask  D 
ON  TMP.IDCLI_TMP = D.IDCLI_CLI