我一直在研究一个存储过程,但遇到了两条非常可怕的行。有没有办法在存储过程中以更清晰的方式重写它?如果没有,我将如何创建一个函数来做到这一点?
, 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
最佳答案
好吧,您可以简单地拥有一个为您完成肮脏工作的函数:
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
关于sql - 重构——两条可怕的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9477120/