1

好的...这就是我得到的。

表 A - 保存产品信息,最相关的是产品描述,我们称之为 A_DESC - A_DESC 每行包含几个单词,大约有 2500 行信息。

表 B - 目前还没有任何内容,但每行包含与表 A 相关的单个单词。表 B 由 B_ID(唯一主)、B_WORD(来自 A_DESC 的唯一单词)和 B_SEED(次数该词可以在表 A 中找到)。

我正在考虑编写一个 vb 脚本来将表 A 中的信息选择到记录集(或现在称为数据集)中,然后遍历每一行,按空格分割值以单独获取每个单词,然后将该单词插入表 B 仅当该单词尚不存在时,如果确实存在,则将 B_SEED 计数增加 1。

然后我想也许这可以通过管理工作室直接从 SQL Server 实现?在没有 vb 作为中间人的情况下,我是否可以编写一个函数来完成此任务?这个脚本每年只需要运行 2-3 次就可以用表 A 中的任何新词更新表 B。我觉得在 VB 中编写它会使用比我需要的更多的资源......

希望我已经确定了我想要完成的事情。

我会尝试在视觉上解释它......

Table A _
A_DESC = "Type 4 felt"
A_DESC = "Type 6 felt"

-->

Table B _
B_ID = 1  |  B_WORD = 'Type'  |  B_SEED = 2
B_ID = 2  |  B_WORD = '4'     |  B_SEED = 1
B_ID = 3  |  B_WORD = 'felt'  |  B_SEED = 2
B_ID = 4  |  B_WORD = '6'     |  B_SEED = 1

哦,是的...编辑

我忘了补充,表 A 与表 B 位于不同的数据库中(虽然在同一台服务器上)

第二次编辑

尝试了@jhinkley 的答案 - 并收到以下错误:

Msg 166, Level 15, State 1, Line 1
'CREATE/ALTER FUNCTION' does not allow specifying the database name as a prefix to the object name.
Msg 137, Level 15, State 2, Line 10
Must declare the scalar variable "@s".
Msg 1087, Level 15, State 2, Line 12
Must declare the table variable "@t".

使用以下代码:

CREATE FUNCTION ROOF.[dbo].[Split] (@sep VARCHAR(32), @s VARCHAR(MAX))

RETURNS @t TABLE
    (
        val VARCHAR(MAX)
    )   
AS
    BEGIN
        DECLARE @xml XML
        SET @XML = N'<root><r>' + REPLACE(@s, @sep, '</r><r>') + '</r></root>'

        INSERT INTO @t(val)
        SELECT r.value('.','VARCHAR(5)') as Item
        FROM @xml.nodes('//root/r') AS RECORDS(r)

        RETURN
    END

truncate table website.dbo.TEXT_WORDS

insert into website.dbo.TEXT_WORDS(T_WORD,T_SEED)
select val,count(val)
from ROOF.dbo.IV00101 
        cross apply ROOF.dbo.Split(' ', replace(ROOF.dbo.IV00101.ITEMDESC,'&','&amp;'))
group by val

我错过了什么?

4

1 回答 1

0

这是一个基于此函数的用于拆分记录T-SQL 的简短脚本:与字符串连接相反 - 如何将字符串拆分为多个记录

CREATE FUNCTION [dbo].[Split] (@sep VARCHAR(32), @s VARCHAR(MAX))

RETURNS @t TABLE
    (
        val VARCHAR(MAX)
    )   
AS
    BEGIN
        DECLARE @xml XML
        SET @XML = N'<root><r>' + REPLACE(@s, @sep, '</r><r>') + '</r></root>'

        INSERT INTO @t(val)
        SELECT r.value('.','VARCHAR(5)') as Item
        FROM @xml.nodes('//root/r') AS RECORDS(r)

        RETURN
    END

truncate table tableB

insert into tableB (B_WORD,B_SEED)
select val,count(val)
from tableA 
        cross apply dbo.Split(' ', replace(A_DESC,'&','&amp;'))
group by val

需要 sql 2005 或更高版本。我假设 B_ID 列没有作为外键的一部分被引用,因此是 truncate table 命令。删除所有记录并再次插入它们比进行更新/合并要容易得多。

于 2013-03-28T20:41:42.097 回答