我正在尝试将40个txt文档存储在数据库中。首先,我创建了一个包含文件ID和名称的表。其次,我创建了一个表(WORDS)
,它将存储所有40个txt文件的内容(逐字逐句)。我需要在表(WORDS)
中创建一个外键,以将每个单词引用到找到它的原始文件。
显然这将是困难的如果我手动完成,因为可能有一百万字。
我的第一个问题:我有什么方法可以自动执行此方法吗?使用SQL查询?
我的第二个问题:sql server如何区分哪个单词最初在哪个文件中?
答案 0 :(得分: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 word=@word
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 fileId=@fileId))
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
请注意,这并未考虑大写与小写。您获得的行为可能取决于您的collation。
此外,将所有这些包装在一个事务中是明智的,您可以直接在此脚本中或在用于进行数据库调用的任何编程API中执行此操作。