1

わかりました...これが私が得たものです。

表 A - 製品情報を保持します。最も関連性の高いのは製品説明です。これを A_DESC と呼びます。A_DESC には、1 行に複数の単語が含まれており、約 2500 行の情報が含まれています。

テーブル B - まだ何も保持していませんが、テーブル A に関連する行ごとに個々の単語を保持します。テーブル B は、B_ID (一意のプライマリ)、B_WORD (A_DESC からの一意の単語)、および B_SEED (回数その単語は表Aにあります)。

テーブル A からレコードセット (または最近ではデータセットと呼ばれるデータセット) に情報を選択し、各行をループし、値をスペースで分割して各単語を個別に取得し、その単語をに挿入する vb スクリプトを作成することを考えていました。テーブル B はその単語がまだ存在しない場合にのみ、存在する場合は B_SEED カウントを 1 増やします。

次に、Management studio を介して SQL Server から直接これが可能であると考えましたか? 仲介者としてvbを持たずにこれを達成するために書くことができる関数はありますか? このスクリプトは、テーブル A の新しい単語でテーブル B を更新するために、おそらく年に 2 ~ 3 回実行するだけで済みます。これを 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 とは異なるデータベースにあります (ただし、同じサーバー上にあります)。

2 回目の編集

@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 列は外部キーの一部として参照されていないため、テーブルの切り捨てコマンドが使用されていると想定しています。更新/マージを行うよりも、すべてのレコードを削除して再度挿入する方がはるかに簡単です。

于 2013-03-28T20:41:42.097 に答える