【发布时间】:2022-01-22 09:00:16
【问题描述】:
我正在使用以下 SQL 创建一个函数来去除字符或数字。
CREATE FUNCTION [dbo].[fn_StripCharacters]
(
@String NVARCHAR(MAX),
@MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
SET @MatchExpression = '%['+@MatchExpression+']%'
WHILE PatIndex(@MatchExpression, @String) > 0
SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')
RETURN @String
END
我这样称呼它来提取字母字符,然后将数字字符提取到两个排序字段中:
SELECT
...
(SELECT dbo.fn_StripCharacters(PD.District, '^a-z')) AS Sort1,
CAST((SELECT dbo.fn_StripCharacters(PD.District, '^0-9')) AS INT) AS Sort2,
...
FROM
我正在搜索大量邮政编码区记录,并且对该函数的不断调用导致了相对较大的延迟。 有没有一种方法可以在没有函数调用的情况下重现此功能? 能否以某种方式将其合并到 SELECT 语句中?
SQL Server 版本是 2017
【问题讨论】:
-
提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。
-
从根本上说,SQL Server 在这方面做得很差......所以你可能会得到一个更快的解决方案,而不是在 SQL Server 中,或者在 CLR 函数中。
-
另外 - “18.9.2”不是有效的 SQL Server 版本 - 最新的是 SQL Server 2019 - v15.xyz -您很可能在谈论 SQL Server Mgmt Studio 的版本——它只是与 SQL Server 对话的 GUI 工具,但它的版本与实际的 SQL Server 版本完全不同。在 SSMS 中运行
SELECT @@VERSION并报告您真正拥有的 SQL Server 版本.... -
最好在内联表值函数中执行此操作。请提供正确的 SQL Server 版本。示例数据和预期结果也适用于 SQL 问题。
-
..将数字与任何其他字符分开(可能值得一试)..dbfiddle.uk/…
标签: sql sql-server tsql query-optimization stored-functions