我有一些数据,其中一些是使用不同的分隔符导入的,例如* - 。或者一个空间...其中一些在导入时被删除,有些则没有。与其进行比较的一些外部值具有相同的问题。所以我们删除所有分隔符并进行比较,我不想只更新列,因为数据不是“我的”。
因为我在代码中反复看到这一点,我正在转向存储过程,我写了一个存储函数来为我做。
ALTER FUNCTION [dbo].[fn_AccountNumber_Format2]
(@parAcctNum NVARCHAR(50))
RETURNS NVARCHAR(50)
AS
BEGIN
SET @parAcctNum = REPLACE(REPLACE(REPLACE(REPLACE(@parAcctNum, '.', ''), '*', ''), '-', ''), ' ', '');
RETURN @parAcctNum
END
通常查询看起来像这样,在几百万行上运行只需不到一秒钟:
SELECT name1, accountID FROM tblAccounts WHERE (Replace(Replace(Replace(accountnumber, '.', ''), '*', ''), '-', '') = Replace(Replace(Replace('123-456-789', '.', ''), '*', ''), '-', ''));
所以我第一次尝试使用它需要24秒才能完成:
SELECT name1, accountID FROM tblAccounts WHERE (dbo.fn_AccountNumber_Format2 ([accountnumber])) = Replace(Replace(Replace('123-456-789', '.', ''), '*', ''), '-', '');
这一次43秒:
SELECT name1, accountID FROM tblAccounts WHERE (dbo.fn_AccountNumber_Format2(accountnumber)) = (dbo.fn_AccountNumber_Format2 ('123-456-789'));
因为我预计用户定义的函数与系统函数REPLACE的运行方式完全相同,所以剧烈的减速对我来说完全震撼...在对stackexchange和google进行一些研究后,似乎使用了Cross Apply并创建了具有该功能的表可能是更好的解决方案,但我不知道它是如何工作的,任何人都可以帮助我吗?
答案 0 :(得分:0)
内联函数
CREATE FUNCTION [dbo].[uspAccountNumber_Format3]
(
@parAcctNum NVARCHAR(50))
RETURNS TABLE
AS
RETURN
(
SELECT REPLACE(REPLACE(REPLACE(REPLACE(@parAcctNum, '.', ''), '*', ''),'-', ''), ' ', '') AS AccountNumber
)
用法
SELECT name1 ,
accountID
FROM tblAccounts
CROSS APPLY dbo.uspAccountNumber_Format3(accountnumber) AS a
CROSS APPLY dbo.uspAccountNumber_Format3('123-456-789') AS b
WHERE a.AccountNumber = b.AccountNumber