我可以使用什么函数(如果有的话)从一个表中选择信息从一个数据库到另一个数据库?

时间:2013-03-28 17:25:38

标签: asp.net sql sql-server sql-server-2008 tsql

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

表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,'&','&amp;'))
group by val
我错过了什么吗?

1 个答案:

答案 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,'&','&amp;'))
group by val

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