27,579
社区成员
发帖
与我相关
我的任务
分享
SQL Server 2008 联机丛书
STUFF (Transact-SQL) 发送反馈
请参阅
全部折叠全部展开 语言筛选器: 全部语言筛选器: 多个语言筛选器: Visual Basic语言筛选器: C#语言筛选器: C++语言筛选器: J#语言筛选器: JScript
Visual Basic(Declaration)
C#
C++
J#
JScript
STUFF 函数将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字符;然后将第二个字符串插入第一个字符串的开始位置。
Transact-SQL 语法约定
语法
STUFF ( character_expression , start , length ,character_expression )
参数
character_expression
一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列。
start
一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。start 可以是 bigint 类型。
length
一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。length 可以是 bigint 类型。
返回类型
如果 character_expression 是受支持的字符数据类型,则返回字符数据。如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。
备注
如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。
如果结果值大于返回类型支持的最大值,则产生错误。
示例
以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串。
复制代码
SELECT STUFF('abcdef', 2, 3, 'ijklmn');
GO
下面是结果集:
复制代码
---------
aijklmnef
(1 row(s) affected)
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([code] [nvarchar](10),[name] [nvarchar](10))
INSERT INTO [tb]
SELECT '01','服装' UNION ALL
SELECT '0101','男装' UNION ALL
SELECT '010101','西装' UNION ALL
SELECT '010102','休闲装' UNION ALL
SELECT '0102','女装' UNION ALL
SELECT '010201','套装' UNION ALL
SELECT '010202','职业装' UNION ALL
SELECT '010203','休闲装' UNION ALL
SELECT '0103','童装' UNION ALL
SELECT '02','电器' UNION ALL
SELECT '0201','进口' UNION ALL
SELECT '0202','国产' UNION ALL
SELECT '03','日用品'
SELECT * FROM [tb]
-->SQL查询如下:
--创建存储过程:
IF OBJECT_ID('[p_copytree]') IS NOT NULL
DROP PROC [p_copytree]
GO
CREATE PROC [p_copytree]
@oldcode varchar(100),
@newcode varchar(100)
AS
INSERT tb
SELECT @newcode+stuff([code],1,len(@newcode),''),[name]
FROM tb T
WHERE [code] LIKE @oldcode+'%'
AND NOT EXISTS(
SELECT 1 FROM tb
WHERE @newcode+stuff(T.[code],1,len(@newcode),'')=code)
AND len([code])>len(@oldcode)
GO
EXEC [p_copytree] '0101','0202'
SELECT * FROM tb
/*
code name
---------- ----------
01 服装
0101 男装
010101 西装
010102 休闲装
0102 女装
010201 套装
010202 职业装
010203 休闲装
0103 童装
02 电器
0201 进口
0202 国产
03 日用品
020101 西装
020102 休闲装
(15 行受影响)
*/
?