2011-11-01 73 views
0

我試圖在數據庫中存儲40個txt文檔。首先,我創建了一個保存文件ID和名稱的表格。其次,我創建了一個表(WORDS),它將存儲所有40個txt文件的內容(逐字)。我需要在表(WORDS)中創建一個外鍵,以將每個單詞引用到找到它的原始文件。Sql外鍵

顯然這將是困難的如果我手動做,因爲可能有一百萬字。

我的第一個問題:有什麼辦法可以自動執行此方法嗎?使用SQL查詢?

我的第二個問題:sql server如何區分哪個文件最初是哪個文件?

+2

那麼,不會無論你用什麼來插入你的文本文件到數據庫中也插入元數據(在哪裏找到等)? – derobert

+0

爲什麼你需要將每個單詞存儲在自己的行中?單詞本身是否代表您的系統的「實體」? –

+0

@derobert插入單詞不是問題,我正在使用BULK。將每個單詞分配給其文件名的外鍵是問題所在。 – HShbib

回答

0

Sql Server(以及許多其他數據庫)支持本機全文搜索,這將是一個比您提出的更好的解決方案。

http://msdn.microsoft.com/en-us/library/ms142571.aspx

這就是說,如果你真的是需要你的方法,你可以這樣做以下:

CREATE table fileTable 
(
    ID int identity, 
    nameOfFile nvarchar(200), 
    PRIMARY KEY (ID), 
    UNIQUE(nameOfFile) 
) 
GO 

CREATE table words 
(
    ID int identity, 
    word nvarchar(200), 
    PRIMARY KEY(ID), 
    UNIQUE(word) 
) 
GO 

CREATE table file_words 
(
    fileId int, 
    wordId int, 
    FOREIGN KEY (fileId) REFERENCES fileTable(ID), 
    FOREIGN KEY (wordId) REFERENCES words(ID), 
    UNIQUE(fileId,wordId) 
) 
GO 

declare @fileContents nvarchar(max) 
SET @fileContents = 'Hello world. I am a silly word splitter.' 
declare @fileName nvarchar(200) 
SET @fileName = 'HelloSplitter.txt' 


declare @whiteSpaceOrPunctuation table 
(
    charVal nchar(1) 
) 

insert @whiteSpaceOrPunctuation 
SELECT ' ' UNION ALL SELECT ',' UNION ALL SELECT ';' UNION ALL SELECT ':' 
UNION ALL SELECT '-' UNION ALL SELECT '_' UNION ALL SELECT '[' UNION ALL SELECT ']' 
UNION ALL SELECT '!' UNION ALL SELECT '.' UNION ALL SELECT '?' UNION ALL SELECT '%' 
UNION ALL SELECT '$' UNION ALL SELECT '#' 
--etc... 

declare @position int 
declare @word nvarchar(max) 
declare @fileLength int 
declare @fileId int 
declare @wordId int 
SET @position = 1 
SET @fileLength = LEN(@fileContents) 
SET @word = '' 
declare @currentChar nchar 

INSERT fileTable (nameOfFile) VALUES (@fileName) 

SELECT @fileId = SCOPE_IDENTITY() 



while (@position <= @fileLength + 1) 
BEGIN 
    --print @position 
    --print @fileLength 

    SELECT @currentChar = SUBSTRING(@fileContents, @position, 1) 

    --print @currentChar 

    IF (EXISTS(SELECT 1 FROM @whiteSpaceOrPunctuation WHERE charVal = @currentChar) OR @position = @fileLength + 1) 
    BEGIN 
     --print 'word: ' + @word 
     IF(@word <> '') 
     BEGIN 
      --print @word 

      SELECT @wordId = ID FROM words where [email protected] 

      IF (@wordId IS NULL) 
      BEGIN 
       INSERT words (word) VALUES (@word) 
       SELECT @wordId = SCOPE_IDENTITY() 
      END 

      IF (NOT EXISTS(SELECT 1 FROM file_words WHERE wordId = @wordId AND [email protected])) 
      BEGIN 
       INSERT file_words (fileId, wordId) VALUES (@fileId, @wordId) 
      END 
      SET @word = '' 
      SET @wordId = null 
     END 
    END 
    ELSE BEGIN 
     SELECT @word = @word + @currentChar 
    END 

    SELECT @position = @position + 1 
END 

--select * from fileTable 
--select * from words 
--select * from file_words 

--drop table file_words 
--drop table words 
--drop table fileTable 

注意這並沒有考慮到上VS小寫。你得到的行爲可能取決於你的collation

另外,將所有這些都包含在一個事務中是明智的,你可以直接在這個腳本中或者在你使用的任何編程API中進行數據庫調用。