22,209
社区成员
发帖
与我相关
我的任务
分享
--多定义几个nvarchar或varchar变量吧
select @变量1 = substring(textData,1,10),@变量2 = substring(textData,100,10) from tb
--1. 把一个表的text数据复制到另一个表。
--测试数据
CREATE TABLE #a(id int,a text)
INSERT #a SELECT 1,'AA'
UNION ALL SELECT 2,'BB'
CREATE TABLE #b(id int,b text)
INSERT #b SELECT 1,'XX'
--用#a.a替换#b.b的数据,条件是#a.id=#b.id
UPDATE b SET b=a.a
FROM #a a,#b b
WHERE a.id=b.id
--把#a的数据复制到#b,条件是#a.id不在#b.id中
INSERT #b(id,b) SELECT id,a FROM #a a
WHERE NOT EXISTS(SELECT * FROM #b WHERE id=a.id)
--显示处理结果
SELECT * FROM #b
DROP TABLE #a,#b
/*--结果
id b
---------------- -------
1 AA
2 BB
--*/
GO
/*===============================================*/
--2. 将tb表中的col1及col2列中的数据合并到col列中,并且在合并的数据前后加上列标识。
--测试数据
CREATE TABLE tb(col text,col1 text,col2 text)
INSERT tb SELECT 'a' ,NULL,'c2'
UNION ALL SELECT NULL,'b2','c2'
UNION ALL SELECT '' ,'b3',NULL
GO
--更新处理
DECLARE @p binary(16),@p1 binary(16),@p2 binary(16)
DECLARE tb CURSOR LOCAL
FOR
SELECT TEXTPTR(col),TEXTPTR(col1),TEXTPTR(col2) FROM tb
OPEN tb
FETCH tb INTO @p,@p1,@p2
WHILE @@FETCH_STATUS=0
BEGIN
IF TEXTVALID('tb.col',@p)=0
BEGIN
UPDATE tb SET col='' WHERE CURRENT OF tb
UPDATE tb SET @p=TEXTPTR(col) WHERE CURRENT OF tb
END
IF TEXTVALID('tb.col1',@p1)=1
BEGIN
UPDATETEXT tb.col @p NULL 0 '<col1>'
UPDATETEXT tb.col @p NULL 0 tb.col1 @p1
UPDATETEXT tb.col @p NULL 0 '</col1>'
END
IF TEXTVALID('tb.col2',@p2)=1
BEGIN
UPDATETEXT tb.col @p NULL 0 '<col2>'
UPDATETEXT tb.col @p NULL 0 tb.col2 @p2
UPDATETEXT tb.col @p NULL 0 '</col2>'
END
FETCH tb INTO @p,@p1,@p2
END
CLOSE tb
DEALLOCATE tb
GO
--显示结果
SELECT * FROM tb
DROP TABLE tb
/*--结果
col col1 col2
-------------------------------------- ----------------------- ----------------------
a<col2>c2</col2> NULL c2
<col1>b2</col1><col2>c2</col2> b2 c2
<col1>b3</col1> b3 NULL
--*/
在进行全文检索之前,必须先建立和填充数据库全文索引。为了支持全文索引操作,SQL Server 7.0新增了一些存储过程和Transact-SQL语句。使用这些存储过程创建全文索引的具体步骤如下(括号内为调用的存储过程名称):
1. 启动数据库的全文处理功能(sp_fulltext_
database);;
2. 建立全文检索目录(sp_fulltext_catalog);
3.在全文检索目录中注册需要全文索引的表(sp_fulltext_table);
4. 指出表中需要全文检索的列名(sp_fulltext_
column);;
5. 为表创建全文索引(sp_fulltext_table);;
6. 填充全文检索目录(sp_fulltext_catalog)。
下面举例说明如何创建全文索引,在本例中,对Test数据库Book表中Title列和Notes列建立全文索引。
use test //打开数据库
//打开全文索引支持,启动SQL Server的全文搜索服务
execute sp_fulltext_database 'enable'
//建立全文检索目录ft_test
execute sp_fulltext_catalog 'ft_test', 'create'
为Title列建立全文索引数据元,pk_title为Book表中由主键所建立的唯一索引,这个参数是必需的。
execute sp_fulltext_table 'book','create', 'ft_test','pk_title'
//设置全文索引列名
execute sp_fulltext_column 'book', 'title', 'add'
execute sp_fulltext_column 'book','notes', 'add'
//建立全文索引
execute sp_fulltext_table 'book', 'activate'
//填充全文索引目录
execute sp_fulltext_catalog 'ft_test', 'start_full'
至此,全文索引建立完毕。
进行全文检索
SQL Server 2000提供的全文检索语句主要有CONTAINS和FREETEXT。CONTAINS语句的功能是在表的所有列或指定列中搜索:一个字或短语;一个字或短语的前缀;与一个字相近的另一个字;一个字的派生字;一个重复出现的字。
CONTAINS语句的语法格式为:
CONTAINS({column | *}),
_condition>)
其中,column是搜索列,使用“*”时说明对表中所有全文索引列进行搜索。Contains_search_
condition 说明CONTAINS语句的搜索内容,其语法格式为:
{||||}[{{AND|AND NOT|OR}}] [...n]
下面就simple_term和prefix_term参数做简要说明:
simple_term是CONTAINS语句所搜索的单字或短语,当搜索的是一个短语时,必须使用双引号作为定界符。其格式为:
{'word'|“ phrase”}
prefix_term说明CONTAINS语句所搜索的字或短语前缀,其格式为:
{“word*” | “phrase*”}
例如,下面语句检索Book表的Title列和Notes列中包含“database”或“computer”字符串的图书名称及其注释信息:
select title, notes
from book
where contains(tilte, 'database') or contains(notes,'database')
or contains(title,'computer') or contains(notes,'computer')
FREETEXT语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并返回与该字符串匹配的数据行。所以,FREETEXT语句所执行的功能又称做自由式全文查询。
FREETEXT语句的语法格式为:FREETEXT({column | * },'freetext_string')
其中,column是被搜索列,使用“*”时说明对表中的所有全文索引列进行搜索。Freetext_string参数指出所搜索的自由文本格式字符串。
例如,下面语句使用FREETEXT语句搜索Book表中包含“Successful Life”字符串的数据行:
select title, notes
from book
where freetext(*,'Successful Life')