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中進行數據庫調用。
那麼,不會無論你用什麼來插入你的文本文件到數據庫中也插入元數據(在哪裏找到等)? – derobert
爲什麼你需要將每個單詞存儲在自己的行中?單詞本身是否代表您的系統的「實體」? –
@derobert插入單詞不是問題,我正在使用BULK。將每個單詞分配給其文件名的外鍵是問題所在。 – HShbib