2011-11-01 56 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中进行数据库调用。