求Contains的用法

kk297173176 2010-04-20 10:16:39
如题,最好是能给个简单的小实例,小弟在此谢过了
...全文
449 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kk297173176 的回复:]
可以进行全文搜索么?
我见到过这样的:select * from table where contains(*,n'something')
这里面的n是什么意思
[/Quote]
一个完整的SQL SERVER数据库全文索引的示例。(以pubs数据库为例)

首先,介绍利用系统存储过程创建全文索引的具体步骤:

1) 启动数据库的全文处理功能 (sp_fulltext_database)
2) 建立全文目录 (sp_fulltext_catalog)
3) 在全文目录中注册需要全文索引的表 (sp_fulltext_table)
4) 指出表中需要全文索引的列名 (sp_fulltext_column)
5) 为表创建全文索引 (sp_fulltext_table)
6) 填充全文目录 (sp_fulltext_catalog)


---------********示例********-------------
以对pubs数据库的title和notes列建立全文索引,之后使用索引查询title列或notes列中包含有datebase 或computer字符串的图书名称:

在这之前,需要安装Microsoft Search服务,启动SQL server全文搜索服务


user pubs --打开数据库
go
--检查数据库pubs是否支持全文索引,如果不支持
--则使用sp_fulltext_database 打开该功能
if(select databaseproperty('pubs','isfulltextenabled'))=0
execute sp_fulltext_database 'enable'

--建立全文目录FT_PUBS
execute sp_fulltext_catalog 'FT_pubs','create'

--为title表建立全文索引数据元
execute sp_fulltext_table 'title','create','FT_pubs','UPKCL_titleidind'

--设置全文索引列名
execute sp_fulltext_column 'title','title','add'
execute sp_fulltext_column 'title','notes','add'

--建立全文索引
--activate,是激活表的全文检索能力,也就是在全文目录中注册该表
execute sp_fulltext_table 'title','activate'

--填充全文索引目录
execute sp_fulltext_catalog 'FT_pubs','start_full'
go

--检查全文目录填充情况
While fulltextcatalogproperty('FT_pubs','populateStatus')<>0
begin

--如果全文目录正处于填充状态,则等待30秒后再检测一次
waitfor delay '0:0:30'
end

--全文目录填充完成后,即可使用全文目录检索

select title
from
where CONTAINS(title,'database')
or CONTAINS(title,'computer')
or CONTAINS(notes,'database')
or CONTAINS(notes,'database')



'--------------以下介绍一下全文操作类的系统存储过程
过程名称:sp_fulltext_service
执行权限:serveradmin或系统管理员
作 用:设置全文搜索属性


过程名称:sp_fulltext_catalog
执行权限:db_owner及更高角色成员
作 用:创建和删除一个全文目录,启动或停止一个全文目录的索引操作


过程名称:sp_fulltext_database
执行权限:db_owner角色成员
作 用:初始化全文索引或删除数据库中所有全文目录


过程名称:sp_fulltext_table
执行权限:db_ddladnmin或db_owner角色成员
作 用:将一个表标识为全文索引表或非全文索引表


过程名称:sp_fulltext_column
执行权限:db_ddladnmin角色成员
作 用:指出一个全文索引表中的那些列假如或退出全文索引
dawugui 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kk297173176 的回复:]
可以进行全文搜索么?
我见到过这样的:select * from table where contains(*,n'something')
这里面的n是什么意思
[/Quote]
unicode.防止不同版本的数据出现乱码.

使用 Unicode 数据
Unicode 标准为全球商业领域中广泛使用的大部分字符定义了一个单一编码方案。所有的计算机都用单一的 Unicode 标准 Unicode 数据中的位模式一致地翻译成字符。这保证了同一个位模式在所有的计算机上总是转换成同一个字符。数据可以随意地从一个数据库或计算机传送到另一个数据库或计算机,而不用担心接收系统是否会错误地翻译位模式。

对于用一个字节编码每个字符的数据类型,存在的问题之一就是此数据类型只能表示 256 个不同的字符。这就迫使对于不同的字母表(例如相对较小的欧洲字母表)采用多重编码规格(或者代码页)。而且也不可能处理象日文汉字或韩国文字这样具有数千个字符的字母表。

每个 Microsoft® SQL Server™ 排序规则都有一个对表示 char、varchar 和 text 值中的每个字符定义位模式进行定义的代码页。可为个别的列和字符常量指派不同的代码页。客户端计算机使用与操作系统区域设置相关联的代码页解释字符位模式。有很多种不同的代码页。一些字符出现在某些代码页上,但并不出现在其它的代码页上。某些字符在一些代码页上用一个位模式定义,而在其它的代码页上却用另一个位模式定义。当您设计必须处理不同语言的国际性系统时,为了满足不同国家/地区的语言需求,给所有的计算机挑选代码页就变得困难了。要保证每一台计算机与使用不同代码页的系统交互时都进行正确的翻译也是困难的。

Unicode 规格通过采用两个字节编码每个字符使这个问题迎刃而解。转换最通用商业语言的单一规格具有足够多的 2 字节的模式 (65,536)。因为所有的 Unicode 系统均一致地采用同样的位模式来代表所有的字符,所以当从一个系统转到另一个系统时,将不会存在未正确转换字符的问题。通过在整个系统中使用 Unicode 数据类型,可尽量减少字符转换问题。

在 Microsoft SQL Server 中,以下数据类型支持 Unicode 数据:

nchar


nvarchar


ntext


说明 这些数据类型的前缀 n 来自 SQL-92 标准中的 National(Unicode)数据类型。

nchar、nvarchar 和 ntext 的用法分别与 char、varchar 和 text 的用法一样,但在以下方面不同:

Unicode支持的字符范围更大。


存储 Unicode 字符所需要的空间更大。


nchar 和 nvarchar 列最多可以有 4,000 个字符,而不象 char 和 varchar 字符那样可以有 8,000 个字符。


Unicode 常量使用 N 开头来指定:N'A Unicode string'。


所有 Unicode 数据都使用相同的 Unicode 代码页。排序规则不控制用于 Unicode 列的代码页,仅控制比较规则和是否区分大小写等特性。
kk297173176 2010-04-20
  • 打赏
  • 举报
回复
可以进行全文搜索么?
我见到过这样的:select * from table where contains(*,n'something')
这里面的n是什么意思
--小F-- 2010-04-20
  • 打赏
  • 举报
回复
全文索引中貌似也有这个
喜-喜 2010-04-20
  • 打赏
  • 举报
回复
CONTAINS用法 
CONTAINS

一个谓词,用于搜索包含基于字符的数据类型的列,该列与单个词和短语,以及与另一个词一定范围之内的近似词精确或模糊(不太精确的)匹配或者加权匹配。CONTAINS 可以搜索:

词或短语。


词或短语的前缀。


另一个词附近的词。


由另一个词的词尾变化生成的词(例如,词 drive 是 drives、drove、driving 和 driven 词尾变化的词干)。


比另一个词具有更高加权的词。
语法
CONTAINS
( { column | * } , ' < contains_search_condition > '
)

< contains_search_condition > ::=
{ < simple_term >
| < prefix_term >
| < generation_term >
| < proximity_term >
| < weighted_term >
}
| { ( < contains_search_condition > )
{ AND | AND NOT | OR } < contains_search_condition > [ ... n ]
}

< simple_term > ::=
word | " phrase "

< prefix term> ::=
{ " word * " | " phrase * " }

< generation_term > ::=
FORMSOF ( INFLECTIONAL , < simple_term > [ ,... n ] )

< proximity_term > ::=
{ < simple_term > | < prefix_term > }
{ { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ... n ]

< weighted_term > ::=
ISABOUT
( { {
<simple_term>
| < prefix_term >
| < generation_term >
| < proximity_term >
}
[ WEIGHT ( weight_value ) ]
} [ , ... n ]
)

参数
column

已经注册全文检索的特定列的名称。字符串数据类型的列是有效的全文检索列。

*

指定应该使用表中所有已注册为全文检索的列,对给定的包含搜索条件进行搜索。如果 FROM 子句中有多个表,那么 * 必须由表名限定。

<contains_search_condition>

指定要在 column 中搜索的文本。变量不能用作搜索条件。

word

没有空格或标点符号的字符串。

phrase

在每个词之间带有空格的一个或多个词。


说明 对于某些语言(例如亚洲的一些语言),短语可以由彼此之间没有空格的一个或多个词组成。

<simple_term>

指定对每个精确词(单字节语言中没有空格或标点符号的一个或多个字符)或短语(单字节语言中由空格和可选的标点符号分隔的一个或多个连续的词)的匹配。有效的简单术语示例为 "blue berry"、blueberry 和 "Microsoft SQL Server"。应该使用双引号 ("") 将短语括起来。短语中词出现的顺序(在 <contains_search_condition> 中指定)必须与它们出现在数据库列中的顺序相同。对词或短语中字符的搜索是区分大小写的。全文索引列中的干扰词(例如 a、and 或 the)不被存储在全文索引中。如果在单个词搜索中使用干扰词,那么 SQL Server 将返回一个错误信息指明查询中只有干扰词出现。SQL Server 在目录 \Mssql\Ftdata\Sqlserver\Config 下包括干扰词的标准列表。

标点符号被忽略。因此,CONTAINS(testing, "computer failure") 将匹配具有 "Where is my computer?Failure to find it would be expensive." 值的行。

<prefix_term>

指定以指定文本开始的匹配词或短语。将前缀术语用双引号 ("") 引起来并在后一个引号前添加一个星号 (*),这样将匹配在星号前指定的所有以简单术语打头的文本。应这样指定该子句:CONTAINS (column, 'text*') 星号匹配零、一个或多个字符(属于词或短语中的词根或词)。 如果未用双引号分隔文本与星号,如 CONTAINS (column, 'text*') 中所示,那么全文检索将把星号作为字符处理并搜索 text* 的精确匹配项。

当 <prefix_term> 是一个短语时,短语中包含的每个词都被认为是一个单独的前缀。因此,指定一个 "local wine *" 前缀术语的查询将匹配任何具有 "local winery"、"locally wined and dined" 等文本的行。

< generation_term >

当所包含的简单术语包括要搜索的原始词的不同变化时,指定匹配的词。 INFLECTIONAL 指定应匹配单数与复数以及名词、动词和形容词的性别与中性形式。也应匹配各种动词时态。

在 <generation_term> 中给定的 <simple_term> 将不与名词和动词匹配。

<proximity_term>

指定匹配的词或短语,这些词或短语必须彼此接近。<proximity_term> 的运算与 AND 运算符相似:两者都要求在被搜索的列中有多个词或短语存在。如果 <proximity_term> 中的词彼此越接近,那么匹配就越好。 NEAR | ~ 指明 NEAR 或 ~ 运算符左边的词或短语应该与 NEAR 或 ~ 运算符右边的词或短语近似接近。可以链接多个近似术语,例如: a NEAR b NEAR c

这表示词或短语 a 应接近词或短语 b,而词或短语 b 应接近词或短语 c。

Microsoft? SQL Server? 对左右两边的词或短语之间的距离分等级。低等级值(例如 0)指明两者之间距离较大。如果指定的词或短语之间相互分开,则认为满足了查询条件;但是,查询有一个很低的 (0) 等级值。然而,如果 <contains_search_condition> 仅由一个或多个 NEAR 近似术语组成,那么 SQL Server 不返回等级值为 0 的行。有关分等级的更多信息,请参见 CONTAINSTABLE 。

<weighted_term>

指定匹配词和短语列表的匹配行(由查询返回),可以对每行随意给定一个加权值。 ISABOUT 指定 <weighted_term> 关键字。
WEIGHT ( weight_value ) 指定数值介于 0.0 和 1.0 之间的加权值。<weighted_term> 中的每个组件可能包含一个 weight_value 。通过 weight_value ,可以改变查询的各个部分怎样来影响指派给与查询匹配的每行的等级值。加权对值的等级进行不同的度量强制,因为使用了 <weighted_term> 的所有组件来共同确定匹配。如果存在与任意一个 ISABOUT 参数的匹配,则返回一行,而不论是否指派了加权值。若要确定每个返回行的等级值(该值指明返回行之间的匹配程度),请参见 CONTAINSTABLE 。

AND | AND NOT | OR

指定两个包含搜索条件之间的逻辑运算。当 <contains_search_condition> 包含有括号中的组时,首先计算这些组。在计算括号中的组之后,当与包含搜索条件一起使用这些逻辑运算符时,应用下面的规则:

NOT 在 AND 之前应用。


NOT 只能出现在 AND 之后,例如 AND NOT。不允许使用 OR NOT 运算符。不能将 NOT 运算符指定在第一术语之前(例如,CONTAINS ( mycolumn , 'NOT "phrase_to_search_for" '))。


AND 在 OR 之前应用。


相同类型的布尔运算符 (AND、OR) 可以结合使用,并因此可以按任何顺序进行应用。
n

一个占位符,指明可在其中指定多个包含搜索条件和术语。

注释
如果兼容级别小于 70,则 CONTAINS 不被看作是关键字。有关更多信息,请参见 sp_dbcmptlevel 。

示例
A. 使用带有 <simple_term> 的 CONTAINS
下面的示例查找包含词"bottles"且价格为 $15.00 的所有产品。

USE Northwind GO SELECT ProductName FROM Products WHERE UnitPrice = 15.00 AND CONTAINS(QuantityPerUnit, 'bottles') GO
B. 在 <simple_term> 中使用 CONTAINS 和短语
下面的示例返回包含短语 "sasquatch ale" 或 "steeleye stout" 的所有产品。

USE Northwind GO SELECT ProductName FROM Products WHERE CONTAINS(ProductName, ' "sasquatch ale" OR "steeleye stout" ') GO
C. 使用带有 <prefix_term> 的 CONTAINS
下面的示例返回所有满足该条件的产品名称:这些产品名称至少含有一个以 ProductName 列中前辍 Choc 起始的词。

USE Northwind GO SELECT ProductName FROM Products WHERE CONTAINS(ProductName, ' "choc*" ') GO
D. 使用带有 <prefix_term> 的 CONTAINS 和 OR
下面的示例返回包含字符串 "sea" 或 "bread" 的所有分类描述。

USE Northwind SELECT CategoryName FROM Categories WHERE CONTAINS(Description, '"sea*" OR "bread*"') GO
E. 使用带有 <proximity_term> 的 CONTAINS
下面的示例返回在词 "spread" 附近有词 "Boysenberry" 的所有产品名称。

USE Northwind GO SELECT ProductName FROM Products WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry') GO
F. 使用带有 <generation_term> 的 CONTAINS
下面的示例搜索具有 dry 形式的词的所有产品:dried 和 drying 等等。

USE Northwind GO SELECT ProductName FROM Products WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ') GO
G. 使用带有 <weighted_term> 的 CONTAINS
下面的示例搜索包含词 spread、sauces 或 relishes 以及给予每个词不同加权的所有产品名称。

USE Northwind GO SELECT CategoryName, Description FROM Categories WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8), sauces weight (.4), relishes weight (.2) )' ) GO
H. 使用带变量的 CONTAINS
下例使用变量而非特定的搜索术语。

USE pubs GO DECLARE @SearchWord varchar(30) SET @SearchWord ='Moon' SELECT pr_info FROM pub_info WHERE CONTAINS(pr_info, @SearchWord)
dawugui 2010-04-20
  • 打赏
  • 举报
回复
A. 使用带有 <simple_term> 的 CONTAINS
下面的示例查找包含词"bottles"且价格为 $15.00 的所有产品。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE UnitPrice = 15.00
AND CONTAINS(QuantityPerUnit, 'bottles')
GO

B. 在 <simple_term> 中使用 CONTAINS 和短语
下面的示例返回包含短语 "sasquatch ale" 或 "steeleye stout" 的所有产品。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "sasquatch ale" OR "steeleye stout" ')
GO

C. 使用带有 <prefix_term> 的 CONTAINS
下面的示例返回所有满足该条件的产品名称:这些产品名称至少含有一个以 ProductName 列中前辍 Choc 起始的词。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ')
GO

D. 使用带有 <prefix_term> 的 CONTAINS 和 OR
下面的示例返回包含字符串 "sea" 或 "bread" 的所有分类描述。

USE Northwind
SELECT CategoryName
FROM Categories
WHERE CONTAINS(Description, '"sea*" OR "bread*"')
GO

E. 使用带有 <proximity_term> 的 CONTAINS
下面的示例返回在词 "spread" 附近有词 "Boysenberry" 的所有产品名称。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
GO

F. 使用带有 <generation_term> 的 CONTAINS
下面的示例搜索具有 dry 形式的词的所有产品:dried 和 drying 等等。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
GO

G. 使用带有 <weighted_term> 的 CONTAINS
下面的示例搜索包含词 spread、sauces 或 relishes 以及给予每个词不同加权的所有产品名称。

USE Northwind
GO
SELECT CategoryName, Description
FROM Categories
WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8),
sauces weight (.4), relishes weight (.2) )' )
GO

H. 使用带变量的 CONTAINS
下例使用变量而非特定的搜索术语。

USE pubs
GO
DECLARE @SearchWord varchar(30)
SET @SearchWord ='Moon'
SELECT pr_info FROM pub_info WHERE CONTAINS(pr_info, @SearchWord)
htl258_Tony 2010-04-20
  • 打赏
  • 举报
回复
联机帮助可以自己参考,我随便摘录一段供参考:

sql约束(constraint)
约束

constraint
约束条件(数据库中的对象)
类型5种
1.非空约束:not null
2.唯一约束:unique
3.主键(语法:非空唯一,逻辑:单独一条记录):primary key
4.外键(被参考的字段必须是主键):
5.check:

create table stu
(
id number(6),
name varchar2(20) constraint stu_name_nn not null,
sex number(2),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50) unique
)

--------------------------------------------------
create table stu
(
id number(6),
name varchar2(20) constraint stu_name_nn not null,
sex number(2),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50),
--email,name组合不能重复约束
constraint stu_name_email_uni unique(email,name)
)
---------------------------------------------------
create table stu
(
id number(6),
name varchar2(20) constraint stu_name_nn not null,
sex number(2),
age number(3),
sdate date,
grade number(2) default 1,
class number(4) ,
email varchar2(50),
--email,name组合不能重复约束
constraint stu_name_email_uni unique(email,name),
constraint stu_id_pk primary key(id) ,
constraint stu_class_fk foreign key key (class) references class(id)
)
---------------------------------------------------
create table class
(
id number(4) primary key,
name varchar2(20) not null,
)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧