sql - 重构——两条可怕的线

标签 sql sql-server sql-server-2008 tsql

我一直在研究一个存储过程,但遇到了两条非常可怕的行。有没有办法在存储过程中以更清晰的方式重写它?如果没有,我将如何创建一个函数来做到这一点?

, 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/

相关文章:

sql-server - 如何过滤单个数据库的 SQL Server 2008 Profiler 输出?

MySQL 查询,MAX() + GROUP BY

sql - MS ACCESS 数据库分成一个月

c# - 在多用户 Web 环境中生成顺序发票编号

sql - 动态查询根据条件选择列

sql - 如何计算 SQL 中计算列的出现次数?

sql-server - ADO.NET 与 SSMS 中的 SQL Server 性能对比

sql - 如何引用第二个 SQL Server

mysql - 如何比较sql中的多个值

sql-server-2008 - Reporting Services字符串串联问题