我有一种情况,我已经创建了脚本来选择公司环境中的数据。在这样做时,我决定在CASE WHEN中使用函数进行一些模式匹配和字符剥离。
但是,我们的一个客户不想让我们将他们的数据放在我们的本地环境中,所以我现在需要按摩脚本才能在他们的环境中运行 - 这实际上意味着我需要删除功能,我无法思考如何移动这些东西。
函数调用的一个例子是:
SELECT ....
CASE WHEN Prp = 'Key Cabinet'
AND SerialNumber IS NOT NULL
AND dbo.fnRemoveNonNumericCharacters(SerialNumber) <> ''
THEN dbo.fnRemoveNonNumericCharacters(SerialNumber)
....
INTO #EmpProperty
FROM ....
其中Prp
是包含属性类型的列,SerialNumber
是包含序列号的列,还有一些其他随机垃圾,因为数据输入很麻烦。
功能定义是:
WHILE PATINDEX('%[^0-9]%', @strText) > 0
BEGIN
SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')
END
RETURN @strText
其中@strText
是我传递的SerialNumber
。
我可能会陷入分析瘫痪,因为我无法找到一个好方法来做到这一点。我不需要一个完整的解决方案,也许只是指出我知道会起作用的方向。如果你想要一些样本DDL / DML搞砸东西,请告诉我。
示例'SerialNumber'值:CA100 (Trash bins)
,T110
,101B
。
还有许多其他类型的值,例如所有文本或所有数字,但我们正在过滤它们。目前的图案匹配已经足够好了。
答案 0 :(得分:2)
所以我认为你的意思是你不能使用某个功能......所以,或许:
declare @table table (SomeCol varchar(4000))
insert into @table values
('1 ab2cdefghijk3lmnopqr4stuvwxyz5 6 !7@#$8%^&9*()-10_=11+[]{}12\|;:13></14? 15'),
('CA100 (Trash bins), T110, 101B')
;with cte as (
select top (100)
N=row_number() over (order by @@spid) from sys.all_columns),
Final as (
select SomeCol, Col
from @table
cross apply (
select (select X + ''
from (select N, substring(SomeCol, N, 1) X
from cte
where N<=datalength(SomeCol)) [1]
where X between '0' and '9'
order by N
for xml path(''))
) Z (Col)
where Z.Col is not NULL
)
select
SomeCol
,cast(Col as varchar) CleanCol --change this to BIGINT if it isn't too large
from Final