我有一个varchar
列,其中包含以下字符串的变体:
Stations, FlightName, FlightWeeks, BindTo, SpotLength, foo, bar, etc...
我需要将其更改为Stations
至Station
,FlightName
至Flight Name
,BindTo
至Bind 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 :(得分:1)
您可以在TSQL中编写自己的Transformation-Function,但我认为它不会像多替换那样高效。 您应该避免在WHERE / ORDER子句中使用多重替换
答案 1 :(得分:0)
创建CLR函数是通过替换单个函数来调用多个REPLACE函数的解决方案。是的,使用CLR函数有一些性能方面的考虑,但是如果你处理的数据量很少,那就没关系了。
用于创建CLR功能,
根据您的要求,我创建了一个这样的示例函数,
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
答案 2 :(得分:0)
我喜欢CLR的想法。 此外,要求也不是很系统。就像FlightWeeks成为Weeks.Why?
尝试我的脚本,除了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