【发布时间】:2016-02-24 08:54:51
【问题描述】:
请找到我写的这个SQL函数
编辑:优化功能,就像在第一个案例中建议的那样
CREATE FUNCTION [dbo].[TL_ReplaceOldBrand]
(
@string NVARCHAR(max),
@BrandName NVARCHAR(50) = N'Brand',
@BrandNameNew NVARCHAR(50) = N'NewBrand'
)
RETURNS NVARCHAR(max)
AS
BEGIN
DECLARE @ResultString NVARCHAR(max) = @string
DECLARE @PossibleCharactersBegin NVARCHAR(100) = N'%[ ,.;:/?!-‘’''"(<>)' + Char(13) + Char(10) + ']'
DECLARE @PossibleCharactersEnd NVARCHAR(100) = N'[ ,.;:/?!-‘’''"(<>)' + Char(13) + Char(10) + ']%'
DECLARE @searchString NVARCHAR(100)
--The brand name ONLY
IF @ResultString = @BrandName
SET @ResultString = REPLACE(@ResultString, @BrandName, @BrandNameNew)
--The brand name at BEGINNING
SET @searchString = N'' + @BrandName + @PossibleCharactersEnd
WHILE PATINDEX(@searchString, @ResultString) > 0
SET @ResultString = STUFF(@ResultString, PATINDEX(@searchString, @ResultString), LEN(@BrandName), @BrandNameNew)
--The brand name BETWEEN words
SET @searchString = N'' + @PossibleCharactersBegin + @BrandName + @PossibleCharactersEnd
WHILE PATINDEX(@searchString, @ResultString) > 0
SET @ResultString = STUFF(@ResultString, PATINDEX(@searchString, @ResultString) + 1, LEN(@BrandName), @BrandNameNew)
--The brand name at the END
SET @searchString = N'' + @PossibleCharactersBegin + @BrandName
WHILE PATINDEX(@searchString, @ResultString) > 0
SET @ResultString = STUFF(@ResultString, PATINDEX(@searchString, @ResultString) + 1, LEN(@BrandName), @BrandNameNew)
RETURN @ResultString
END
当我这样使用它时就像这样:
select dbo.TL_ReplaceOldBrand(N'I want to replace, Brand by NewBrand, in a long long text which have multiple Brand occurences.', DEFAULT, DEFAULT)
没有发生替换。但是,如果我在函数定义中将所有 NVARCHAR 替换为 VARCHAR,它就可以正常工作并按照我的意愿将 Brand 替换为 NewBrand。
谁能给我解释一下为什么?
为了回答这个问题,我为什么要使用 NVARCHAR 而不是 VARCHAR,这是因为该函数用于包含多种语言文本的列,这些文本带有特殊字符,例如中文、泰文或韩文
【问题讨论】:
-
由于您的第一次搜索/替换使用的是最匹配的字符串,您认为后续搜索会做什么? IE。如果你已经通过一个字符串将每个
A替换为B,为什么你认为你会在随后的匹配中尝试找到A,并对其周围的字符进行额外的限制? -
一旦你过了那个点,为什么不直接使用
REPLACE而不是手动查找/替换事件。 -
REPLACE 当您没有多个可以呈现单词的情况时很好。我可以有“,Brand:”或“Brand”或“Brand-”或“Brand_”。
-
但是如果你有更好的想法来优化这个功能,我会听取每一个解决方案。我不是 SQL Server 专家,我每天都在听,所以我在练习 ;-)
-
也许是这样,但您的第一个查找和替换是在寻找“品牌”,周围没有任何东西,这也与所有其他情况相匹配。它正在做
REPLACE会做的事情。
标签: sql sql-server-2012