如何修改t-sql来处理多个记录而不仅仅是一个。

时间:2017-09-07 14:54:17

标签: sql sql-server tsql stored-procedures

我正在开发一个函数来从名为“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那样完成。我想处理大量的记录。

我希望能得到一些帮助,谢谢你的帮助。

代码示例取自:remove special characters from string in sql server

1 个答案:

答案 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