2015-03-03 96 views
0

我有一個varchar列具有以下字符串的變化:有沒有更好的方法來對字符串進行多重替換?

Stations, FlightName, FlightWeeks, BindTo, SpotLength, foo, bar, etc...

我需要將其更改爲StationsStationFlightNameFlight NameBindToBind To等,最終出來的是這樣的:

Station; Flight Name; Weeks; Bind To; Spot Length; foo; bar

我有一個非常醜陋的代碼來做到這一點:

select replace(replace(replace(replace(replace(replace(GroupFlightsBy, ', ', ';'), 
'Stations', 'Station'), 'FlightName', 'Flight Name'), 'FlightWeeks', 'Weeks'), 'BindTo', 'Bind To'), 
'SpotLength', 'Spot Length') 

有沒有更好的方法做到這一點,但作爲性能?

+0

首先想到的不是關於字符串替換;但它聽起來像是將數據合併到varchar-column中,而不是使用單獨的列。這些值是什麼意思? – sisve 2015-03-03 07:10:19

+0

@SimonSvensson基本上這些是來自多選下拉框的值。數據已經存在 - 我無法改變它。 – AngryHacker 2015-03-03 07:21:18

+0

爲什麼你不能更改數據庫?它是否存儲在一些只讀媒體上?還是你說你作爲一個開發人員,在開發過程中被認爲是最好的,沒有權限去做改變? (引導性問題;數據庫總是可以改變的;不變的要求通常來自於人類的某個地方) – sisve 2015-03-03 07:40:36

回答

0

創建CLR函數是通過替換單個函數來調用多個REPLACE函數的解決方案。是的,使用CLR函數有一些性能方面的考慮因素,但是如果您處理的數據量較少,那就沒問題。

爲了創建CLR函數,

對於您的要求我創建了一個樣本函數LIK E本,

using System.Data.SqlTypes; 

public partial class UserDefinedFunctions 
{ 
    [Microsoft.SqlServer.Server.SqlFunction] 
    public static SqlString ReplaceFunc(string inputString) 
    { 
     return new SqlString (inputString 
      .Replace("Stations", "Station") 
      .Replace("FlightName", "Flight Name") 
      .Replace("FlightWeeks", "Weeks") 
      .Replace("BindTo", "Bind To") 
      .Replace("SpotLength", "Spot Length") 
      .Replace(", ", ";")); 
    } 
}; 

,並從這樣的SQL調用,

DECLARE @GroupFlightsBy VARCHAR(MAX) = 'Stations, FlightName, FlightWeeks, BindTo, 
SpotLength, foo, bar' 

SELECT dbo.ReplaceFunc(@GroupFlightsBy) 

更多關於CLR函數,

http://sqlmag.com/database-development/common-language-runtime-dba-point-view

https://stackoverflow.com/a/25876797/311255

+0

確定你可以通過clr來完成。但是多替換也可以通過tsql函數來完成,這將更容易維護並且更快執行。那麼爲什麼這是解決方案? – swe 2015-03-04 08:13:09

1

你可以在TSQL中編寫自己的轉換函數,但我認爲它不會像多重替換一樣具有性能。 您應該避免在WHERE/ORDER-clause中使用多重替換

0

我喜歡CLR想法。 此外,這個要求並不是非常系統化。就像FlightWeeks變成Weeks一樣。爲什麼?

試試我的腳本,它做工精細,除了FlightWeeks

DECLARE @Temp VARCHAR(100)='FlightName' 

Declare @Pattern1 as varchar(50) 
Declare @Pattern2 as varchar(50)='%s%' 
Declare @flg bit=0 
    Set @Pattern1 = '%[^ ][A-Z]%' 

    While PatIndex(@Pattern1 collate Latin1_General_Bin, @Temp) > 0 
BEGIN 
     Set @Temp = Stuff(@Temp, PatIndex(@Pattern1 collate Latin1_General_Bin, @Temp) + 1, 0, ' ') 

     set @flg=1 
END 
    if(@flg=0) 
    if PatIndex('%s%' , substring(@Temp,len(@temp),1)) >0 
     Set @Temp = substring(@Temp,0,len(@temp)) 

select @Temp 

--'FlightName' return Flight Name 
--Stations return Station 
-- foo return foo 
--FlightWeeks return Flight Weeks 
相關問題