2013-03-28 56 views
1

好的......這是我得到了。什麼功能(如果有的話)我可以用它來從一個表中選擇的信息從一個數據庫到另一個數據庫?

表A - 保留產品信息,最相關的是產品說明,我們稱之爲A_DESC - A_DESC每行包含幾個字,約2500行信息​​。表B由B_ID(唯一主鍵),B_WORD(來自A_DESC的唯一字)和B_SEED組成.B_ID(唯一主鍵),B_WORD(來自A_DESC的唯一字),B_SEED (這個詞可以在表A中找到的次數)。

我正在考慮編寫一個VB腳本來從表A中選擇信息到一個記錄集(或現在稱爲它的數據集)中,然後循環遍歷每一行,按空格分隔值以獲取每個單詞,然後如果該單詞不存在,並且如果它確實存在,則將該單詞插入到表B中,並且如果它確實存在,則將B_SEED計數增加1.

然後我想也許這是可以直接從SQL Server通過Management Studio?有沒有一個函數可以編寫來實現這個功能,而不需要vb作爲中間人?該腳本將只需要一年2-3次,也許運行與表A.任何新的話,我覺得好像在VB比我需要會使用更多的資源寫這篇更新表B中......

希望我已經確定了我想要完成的事情。

我會盡量在視覺上解釋...

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 

我錯過了什麼?

+0

您可以與您正在使用什麼版本的SQL的MERGE語句......很容易地做到這一點? –

+0

A_DESC是單列嗎?如果是這樣,最難的部分將分開的話。在這裏有幾篇關於用分隔符分割SQL字符串的文章,那麼你應該能夠相對容易地使用插入語句中的輸出。 – Jaloopa

+0

SQL '08 A_DESC是一個表中的單個列,大約有30個列 – Kizzelwhix

回答

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命令。刪除所有記錄並重新插入它們比更新/合併更容易。

+0

謝謝@jhinkley - 今晚我會回家試試這個標籤,如果/當它正常工作,標籤會正確。 – Kizzelwhix

+0

我忘了提及...表是在單獨的數據庫。我將該函數放入哪個數據庫?發送或接收? – Kizzelwhix

+0

@Kizzelwhix任何一個。你必須給表格和函數的完整路徑,即。 databaseA.dbo.tableA,databaseB.dbo.tableB和databaseA.dbo.Split – jhinkley

相關問題