SQL的存储过程

firdx_maomao 2010-05-16 10:55:49
code name
01 服装
0101 男装
010101 西装
010102 休闲装
0102 女装
010201 套装
010202 职业装
010203 休闲装
0103 童装
02 电器
0201 进口
0202 国产
03 日用品
根据此表,用存储过程实现结点的复制功能,存储过程参数为要复制的结点代码目标结点代码
应该如何完成,请指教!
...全文
76 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
firdx_maomao 2010-05-16
  • 打赏
  • 举报
回复
Think YOU
htl258_Tony 2010-05-16
  • 打赏
  • 举报
回复
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)
youyou2404 2010-05-16
  • 打赏
  • 举报
回复
在顶下tony哥
STUFF
删除指定长度的字符并在指定的起始点插入另一组字符。

语法
STUFF ( character_expression , start , length , character_expression )

firdx_maomao 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 firdx_maomao 的回复:]
stuff([code],1,len(@newcode),''),[name]
有什么用啊
[/Quote]
没有
htl258_Tony 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 firdx_maomao 的回复:]
stuff([code],1,len(@newcode),''),[name]
有什么用啊
[/Quote]
先不谈这个,我对你需求的理解有没有错
firdx_maomao 2010-05-16
  • 打赏
  • 举报
回复
stuff([code],1,len(@newcode),''),[name]
有什么用啊
youyou2404 2010-05-16
  • 打赏
  • 举报
回复
顶tony

htl258_Tony 2010-05-16
  • 打赏
  • 举报
回复
--> 生成测试数据表: [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 行受影响)
*/
?
firdx_maomao 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 htl258 的回复:]
复制后的名称用复制前的名称吗?
[/Quote]
是的
htl258_Tony 2010-05-16
  • 打赏
  • 举报
回复
复制后的名称用复制前的名称吗?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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