好的......这就是我得到的。
表A. - 保存产品信息,最相关的是产品描述,我们称之为A_DESC - A_DESC每行包含几个单词,以及大约2500行信息。
表B. - 暂时没有任何内容,但每行保留一个与表A相关的单词。表B由B_ID(唯一主要),B_WORD(来自A_DESC的唯一字)和B_SEED(该字的次数)组成可以在表A)中找到。
我正在考虑编写一个vb脚本来从表A中选择信息到记录集(或现在称为数据集),然后遍历每一行,按空格分割值以单独获取每个单词,然后插入只有在该单词尚不存在的情况下,该单词进入表B,如果它确实存在,则将B_SEED计数增加1.
然后我想也许这可以通过Management Studio直接从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,'&','&'))
group by val
我错过了什么吗?
答案 0 :(得分:0)
这是一个基于此功能的短脚本,用于分割记录T-SQL: Opposite to string concatenation - how to split string into multiple records
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,'&','&'))
group by val
需要sql 2005或更高版本。我假设B_ID列未作为外键的一部分引用,因此truncate table命令。删除所有记录并再次插入它们比执行更新/合并要容易得多。