我正在开发一个函数来从名为“Title”的列中删除/替换字符串中的特殊字符。目前我正在测试一次记录的代码。我想针对表中的所有记录测试代码,但我不知道如何修改当前的t-sql来处理所有记录而不是一次只处理一个。如果有人能告诉我如何处理所有记录,或者需要做哪些类型的修改,我将不胜感激。
这是我现在拥有的代码:
url = 'http://wxchallenge.com/challenge/distribution.php'
r = requests.get(url)
soup = BeautifulSoup(r.text,'lxml')
对于包含值的标题:SchöneWiegeMeiner Leiden,应用代码后的输出将是:schone_wiege_meiner_leiden
我想让代码处理多个记录,而不是像目前通过指定ID那样完成。我想处理大量的记录。
我希望能得到一些帮助,谢谢你的帮助。
答案 0 :(得分:1)
这里不需要循环。您可以改为使用计数表,这可以很容易地成为基于集合的内联表值函数。性能方面,它会打破基于循环的标量函数。
我在我的系统中保留了一个计数表作为视图。这是计数表的代码。
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
现在是有趣的部分,用它来解析字符串和各种各样的东西。它被称为t-sql的瑞士军刀。无论何时开始思考循环,都要考虑使用计数表来代替。以下是此功能的外观。
create function RemoveValuesFromString
(
@SearchVal nvarchar(max)
, @CharsToRemove nvarchar(max)
) returns table as
RETURN
with MyValues as
(
select substring(@SearchVal, N, 1) as MyChar
, t.N
from cteTally t
where N <= len(@SearchVal)
and charindex(substring(@SearchVal, N, 1), @CharsToRemove) = 0
)
select distinct MyResult = STUFF((select MyChar + ''
from MyValues mv2
order by mv2.N
FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'), 1, 0, '')
from MyValues mv
;
以下是您可以如何使用此功能的示例。我在这里使用表变量,但这可以是任何表或其他任何内容。
declare @SomeTable table
(
SomeTableID int identity primary key clustered
, SomeString varchar(max)
)
insert @SomeTable
select 'This coffee cost $32.!!! This is a@ tot$@a%l r)*i-p~!`of^%f' union all
select 'This &that'
select *
from @SomeTable st
cross apply dbo.RemoveValuesFromString(st.SomeString, '%[~,@#$%&*()!´:]%`^-') x