T-SQL语法 - 单词解析器

时间:2015-09-19 09:02:55

标签: tsql

我在变量中有一个单词列表。这些单词以逗号分隔。我试图将它们保存到数据库中的单个记录中。我找到了另一个问题,它可以做到这一点并起作用,但它可以保存每个字我试图修改它,以便我只保存唯一的单词,并在我去的时候重复计算。我认为下面的逻辑是正确的,但我的语法不起作用。

  1. if @FoundWord = 0 SET @WordsUsed = @WordsUsed +''+ @Word +''
  2. **没有将下一个单词连接到@WordsUsed变量的末尾

    1. if @FoundWord = 0 INSERT INTO mydata.dbo.words(ProjectNumber,WordCount,Word)VALUES('5','1',@ Word)
    2. **似乎根本没有做任何事情......我没有写入单词表

      的记录

      整个代码如下:

      declare @SplitOn nvarchar(5) = ','
      BEGIN
      DECLARE @split_on_len INT = LEN(@SplitOn)
      DECLARE @start_at INT = 1
      DECLARE @end_at INT
      DECLARE @data_len INT
      DECLARE @WordsUsed varchar(max)
      DECLARE @FoundWord int
      DECLARE @Word varchar(100)
      
      Set @WordsUsed = '**'
      WHILE 1=1
      BEGIN
          SET @end_at = CHARINDEX(@SplitOn,@txt1,@start_at)
          SET @data_len = CASE @end_at WHEN 0 THEN LEN(@txt1) ELSE @end_at-@start_at END
          set @Word = SUBSTRING(@txt1,@start_at,@data_len)
          SET @FoundWord = CHARINDEX('*' & @Word & '*', @WordsUsed)
          if @FoundWord = 0 SET @WordsUsed = @WordsUsed & '*' & @Word & '*'
          if @FoundWord = 0 INSERT INTO mydata.dbo.words (ProjectNumber, WordCount, Word) VALUES( '5', '1', @Word )
          if @FoundWord > 0 Update mydata.dbo.words set WordCount = WordCount + 1 where projectnumber = 5 and word = @word
          IF @end_at = 0 BREAK
          SET @start_at = @end_at + @split_on_len
      END
      
      RETURN
      END;
      

2 个答案:

答案 0 :(得分:1)

这是您可以尝试的功能。它根据您选择的分隔符拆分无限大小的字符串。函数的输出是一个表 - 因此您可以选择与该表不同来存储单词列表。你可以这样称呼它:

insert YourWordlistTable ( Word )  --> just making up table/column names here
select distinct Data 
from dbo.StringSplit( @yourVar, ',' )

这里是函数的定义:

create function dbo.StringSplit
(
   @string nvarchar( max ),
   @delimiter nvarchar( 255 )
)
returns @t table ( Id int, Data nvarchar( 4000 ) )
as begin

    with Split( startPosition, endPosition )
    as
    (
      select 
         cast( 0 as bigint ) as startPosition, 
         charindex( @delimiter, @string ) as endPosition
      union all
      select 
         endPosition + 1, charindex( @delimiter, @string, endPosition + 1 )
      from 
         Split
      where 
         endPosition > 0
    )
    insert @t
    select 
      row_number() over ( order by ( select 1 ) ) as Id,
      substring( @string, startPosition, coalesce( nullif( endPosition, 0 ), len( @string ) + 1 ) - startPosition ) collate Latin1_General_CS_AS as Data
    from 
      Split 
    option( maxrecursion 0  );

    return;
end

我最初发布,然后删除,然后重新发布这个,当我意识到我给出了一个内联函数,我使用了从未调用超过100字的字符串。我修改它以支持无限递归 - 虽然它不能以这种方式成为内联函数。

内联函数通常更快,因为SQL可以将内联函数的语句合并到调用函数的语句的查询计划中。但是,这似乎不是内联函数中可用的选项。

答案 1 :(得分:0)

为什么你不能使用 select count(distinct value) from dbo.split(',',@txt1)其中@txt1是字符串将为您提供不同的单词数

如果您正在寻找明智的数字

select value,count(1) from dbo.split(',',@txt1) group by value 

做这个

相关问题