SQL Server 2008 обновляет один столбец значением, основанным на количестве слов в другом - PullRequest
0 голосов
/ 05 мая 2010

Столбцы Words, WordsCount

Для каждого значения Words «xyz» обновляет wordscount с 3, «ab» с 2, «abcd» с 4 и т. Д.

Как можноЯ делаю это с / без программы .Net?

Ответы [ 2 ]

2 голосов
/ 05 мая 2010

Если вы можете рассчитывать на то, что все слова всегда разделены одним пробелом:

UPDATE table SET WordCount = (LEN(Words) - LEN(REPLACE(Words, ' ', ''))) + 1

Это ломается, когда в словах нет ничего или NULL, но вы понимаете ...

1 голос
/ 05 мая 2010

Вы могли бы сделать это с помощью функции разделения, где вы разделяете на пробел:

Create FUNCTION [dbo].[udf_Split] (@DelimitedList nvarchar(max), @Delimiter nvarchar(2) = ',')
RETURNS @SplitResults TABLE (Position int NOT NULL PRIMARY KEY, Value nvarchar(max))
AS
Begin
    Declare @DelimiterLength int
    Set @DelimiterLength = DataLength(@Delimiter) / 2

    If Left(@DelimitedList, @DelimiterLength) <> @Delimiter
        Set @DelimitedList = @Delimiter + @DelimitedList

    If Right(@DelimitedList, @DelimiterLength) <> @Delimiter
        Set @DelimitedList = @DelimitedList + @Delimiter

    Insert @SplitResults(Position, Value)
    Select CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength            
        , Substring (
                    A.List
                    , CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength         
                    , CharIndex(@Delimiter, A.list, N.Value + 1)                            
                        - ( CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength ) 
                    )
    From dbo.Numbers As N
        Cross Join (Select @DelimitedList As list) As A
    Where N.Value > 0
        And N.Value < LEN(A.list)
        And Substring(A.list, N.Value, @DelimiterLength) = @Delimiter
    Order By N.Value

    Return
End

Update Table
Set WordCount = (
                Select Count(*)
                From dbo.udf_Split(Table.WordlistCol, ' ')
                )

Эта версия функции разбиения основана на существовании таблицы Numbers, которая содержит последовательный список целочисленных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...