2012-02-28 49 views
4

我一直在研究一个存储过程,并创建了一个我有两条非常可怕的线路的点。有没有办法在存储过程中以更清晰的方式重写这个?如果不是,我将如何去创建一个功能来做到这一点?重构 - 两条可怕的线路

, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(l.tenant_trading_name,'~','-'), '"','-'), '#','-'), '%','-'), '*','-'), ':','-'), '<','-'), '>','-'), '?','-'), '/','-'), '\','-'), '{','-'), '|','-'), '}','-') as trading_name 
    , REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(l.suite_name,'&','-'), '~','-'), '"','-'), '#','-'), '%','-'), '*','-'), ':','-'), '<','-'), '>','-'), '?','-'), '/','-'), '\','-'), '{','-'), '|','-'), '}','-') as suite_name 
+1

可能会有帮助:http://stackoverflow.com/questions/1864838/remove-trailing-empty-space-in-a-field-content – 2012-02-28 06:02:20

+3

只是一个想法:既然T-SQL基本上在吸字符串操作:如何在C#中创建“字符串助手”程序集并使用SQL CLR将其包含到SQL Server中?与T-SQL的有限功能相比,.NET对于字符串操作的东西更加强大(并且更易于使用!)... – 2012-02-28 06:29:49

+0

@marc_s有趣,没有考虑到它。将更多地研究它并将其作为一个选项进行探索。非常感谢您为C#提供的 – Codingo 2012-02-28 06:34:23

回答

2

那么你可以简单的函数是干这个苦差事你:

CREATE FUNCTION dbo.CleanCharacters 
(
    @InputString VARCHAR(64), 
    @UseAmp BIT 
) 
RETURNS VARCHAR(64) 
AS 
BEGIN 
    RETURN(SELECT REPLACE(REPLACE(REPLACE(...REPLACE(
     @InputString, CASE WHEN @UseAmp = 1 THEN '&' ELSE '-' END, '-'), 
     '~', '')...etc etc...))) 
); 
END 
GO 

然后你就可以说:

SELECT dbo.CleanCharacters(l.tenant_trading_name, 0), 
dbo.CleanCharacters(l.suite_name, 1) FROM ... 

这至少抽象丑陋REPLACE()召唤出的程序。

(请注意,我并没有完全解析整条生产线,看是否有其他方面的差异,但在我看来,唯一的区别是suite_name不能有&但交易名称可以。)

另一种方法是将你的“坏”字符存储在表格中,这样更容易维护这些替换(并且一旦表被填充,使得该功能更清洁)。现在

CREATE TABLE dbo.DirtyCharacters(x CHAR(1)); 

INSERT dbo.DirtyCharacters SELECT '~' 
    UNION ALL SELECT '&' 
    UNION ALL SELECT '*' 
-- ... 
; 

你可以有你的函数简单地说:

ALTER FUNCTION dbo.CleanCharacters 
(
    @InputString VARCHAR(64), 
    @UseAmp BIT 
) 
RETURNS VARCHAR(64) 
AS 
BEGIN 
    SELECT @InputString = REPLACE(@InputString, x, '-') 
    FROM dbo.DirtyCharacters 
    WHERE x <> CASE WHEN @UseAmp = 1 THEN '' ELSE '&' END; 

    RETURN (@InputString); 
END 
GO 
+0

迄今为止最清洁的,当然看起来像迄今为止最好的选择 – Codingo 2012-02-28 06:19:05

0

似乎它适用于例如你的第一个字符串。

SELECT @Str = REPLACE(@Str , chr , '-') 
     FROM (SELECT '~' UNION 
     SELECT '"' UNION 
     SELECT '#' UNION 
       SELECT '%' UNION 
       SELECT '*' UNION 
       SELECT ':' UNION 
       SELECT '<' UNION 
       SELECT '>' UNION 
       SELECT '?' UNION 
       SELECT '/' UNION 
       SELECT '\' UNION 
       SELECT '{' UNION 
       SELECT '|' UNION 
       SELECT '}' UNION 
       SELECT '%') D (chr) 
    WHERE CHARINDEX(chr , @Str) > 0 ; 
    SELECT @str ; 
+1

两个快速评论:(1)我不确定这比所有的REPLACE行都更漂亮,并且(2)我怀疑变量赋值是如果这是多行查询中'SELECT'列表的一部分,则在此处有效。 – 2012-02-28 06:16:02