text 类型中查找和截串

elysium1984 2009-04-20 05:02:23
有一段text类型的数据,大概形式如下吧
@text=‘#天天***天天#1#’
# 为分隔符,***为不定数量的字符
我想取出:天天***天天 1
可是用substring截的话,汉字在varchar类型下和text类型下的长度不一样,应该怎么办呢?各位帮帮忙。
另外,截取后的字符串可以放在varchar类型变量中,
但是截取前,因为长度超过8000,所以不能转为varchar。
谢谢大家了
...全文
108 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
長胸為富 2009-04-20
  • 打赏
  • 举报
回复

--多定义几个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
--*/
limyu138 2009-04-20
  • 打赏
  • 举报
回复
如果字符大于8000那么需要另外开辟一个空间来...
分开来嘛..呵呵...
elysium1984 2009-04-20
  • 打赏
  • 举报
回复
环境是2000,没有max
yygyogfny 2009-04-20
  • 打赏
  • 举报
回复
全文索引?
htl258_Tony 2009-04-20
  • 打赏
  • 举报
回复
全文索引比较麻烦,提供个参考资料你自己看下:
在进行全文检索之前,必须先建立和填充数据库全文索引。为了支持全文索引操作,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')
htl258_Tony 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 elysium1984 的回复:]
说了不能转了,那个长度不够用
[/Quote]
SQL2005的可以转为VARCHAR(MAX),SQL2000的用全文索引.
usher_gml 2009-04-20
  • 打赏
  • 举报
回复
帮顶
elysium1984 2009-04-20
  • 打赏
  • 举报
回复
说了不能转了,那个长度不够用
jia_guijun 2009-04-20
  • 打赏
  • 举报
回复
sql server 2005中有nvarchar(max) 或varchar(max)类型,转换后试一下。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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