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