求助,本人菜鸟

xxxcloud 2012-04-20 02:47:55
我需要创建一个存储过程有一个表三列 第一列是类型的ID 第二列是类型的名字 第三列是辅助类型要求如下
第一列是类型的ID 第二列是类型的名字 第三列是辅助类型要求如下
如果是主类型那第一列就是一个字母 第三列为空
如果是附类型那第一列为组类型的字母加流水号 第三列为主类型的字母
列表如下:
TypeID TypeName ParentID
A 快餐 NULL
A-01 肉类 A
A-02 海鲜类 A
A-03 蔬菜 A
B 水果 NULL
B-01 地水果 B
用的是sql server
本人谢谢了
因是有判断的
而且数据是字母的就明白
主类别的变化是从A到Z的具体有多少没有固定
谢谢了
...全文
330 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
arduact 2012-04-21
  • 打赏
  • 举报
回复
update table set ParentID=(when len(TypeID)=1 then null else left(TypeID,1) end)
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
用 28楼的那种格式要好点
就是不懂才要学
呵呵
谢谢你
wangjunjie321
加分没加上
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
谢谢
谢谢两位
我前台还没做完
不过先结贴了
再有问题在问
我要好好看看这代码
十三门徒 2012-04-20
  • 打赏
  • 举报
回复
update table set TypeID=(case when len(ParentID)=1 then (select ParentID+'-'+(case when len(max(right(TypeID,2)+1))=1 then '0'+cast(max(right(TypeID,2)+1) as varchar(1))
else cast(max(right(TypeID,2)+1) as varchar(2)) end)
from table where len(ParentID)>1 ) else (select CHAR(UNICODE(MAX(TypeID)) + 1) FROM TABLE where ParentID is null) end)


用一条update语句 怕你看不懂
十三门徒 2012-04-20
  • 打赏
  • 举报
回复
update table set TypeID=(select ParentID+'-'+(case when len(max(right(TypeID,2)+1))=1 then '0'+cast(max(right(TypeID,2)+1) as varchar(1))
else cast(max(right(TypeID,2)+1) as varchar(2)) end)
from table where len(ParentID)=1

当是添加的是新附类别的时候用这个更新,如果是主的话,要么就是里面去判断当前的最大字母是什么,然后在取它后面,或者建立一个表,存储26个字母,然后给个顺序1-26,当时做关联比较容易取出下一个字母。
孤独加百列 2012-04-20
  • 打赏
  • 举报
回复

--CREATE table TABLE1
--(TypeID varchar(4),TypeName varchar(6),ParentID varchar(1))

--GO
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'UP_InsertFruit')
BEGIN
DROP PROC UP_InsertFruit
END
GO
CREATE PROC UP_InsertFruit
(
@Name VARCHAR(100),
@Type VARCHAR(100),
@ReturnValues_Int INT = 0 OUTPUT
)

AS

DECLARE @MainTYpe VARCHAR(10)
DECLARE @ERROR INT

IF @Type IS NULL
BEGIN
IF EXISTS (SELECT 1 FROM Table1)
BEGIN
SELECT @MainTYpe = CHAR(UNICODE(MAX(TypeID)) + 1) FROM TABLE1
END
ELSE
BEGIN
SET @MainTYpe = 'A'
END

END
ELSE
BEGIN
IF EXISTS (SELECT 1 FROM Table1 WHERE ParentID = @Type)
BEGIN
SELECT @MainTYpe = CAST((MAX(CAST(RIGHT(TypeID,2) AS INT)) + 1) AS VARCHAR(10)) FROM TABLE1 WHERE ParentID = @Type
END
ELSE
BEGIN
SET @MainTYpe = '01'
END
IF LEN(@MainTYpe) = 1
BEGIN
SET @MainTYpe = '0' + @MainTYpe
END

SET @MainTYpe = @Type + '-' + @MainTYpe
END

BEGIN TRAN

INSERT INTO Table1 VALUES (@MainTYpe,@Name,@Type)
SET @ERROR = @@ERROR
IF @ERROR > 0
BEGIN
GOTO ERRORHANDLE
END

COMMIT TRAN
RETURN 100

ERRORHANDLE:
ROLLBACK TRAN
RETURN -100

GO

EXEC UP_InsertFruit '苹果',NULL
EXEC UP_InsertFruit '红富士','A'

SELECT * FROM TABLE1

TypeID TypeName ParentID
A 苹果 NULL
A-01 红富士 A
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
第一个 insert into table values(null ,'鲜花',null)
第二个是insert into table values(null ,'进口水果',B)
十三门徒 2012-04-20
  • 打赏
  • 举报
回复
我想知道的是你前台程序望数据库里面插入数据时候怎么插入 如:insert into table values('A' ,'鲜花',null) 还是insert into table values(null ,'鲜花',null)?insert into table values('B-02' ,'进口水果',null) 还是insert into table values(null ,'进口水果',null)?
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

给几条你插入后的数据,然后说下你想更新成什么样子吧
[/Quote]
wangjunjie321 上面的那些能完成吗?
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]

SQL code

CREATE table TABLE1
(TypeID varchar(4),TypeName varchar(6),ParentID varchar(1))

GO

CREATE PROC UP_InsertFruit
(
@Name VARCHAR(100) = '',
@Type VARCHAR(100) = '',
@ReturnValu……
[/Quote]
啊!
看不懂
我真的有那么菜吗
孤独加百列 2012-04-20
  • 打赏
  • 举报
回复

CREATE table TABLE1
(TypeID varchar(4),TypeName varchar(6),ParentID varchar(1))

GO

CREATE PROC UP_InsertFruit
(
@Name VARCHAR(100) = '',
@Type VARCHAR(100) = '',
@ReturnValues_Int INT = 0 OUTPUT
)

AS

DECLARE @MainTYpe VARCHAR(10)
DECLARE @ERROR INT

IF (CHARINDEX('-',@Type) > 0)
BEGIN
SET @MainTYpe = LEFT(@Type,1)
END
ELSE
BEGIN
SET @MainTYpe = ''
END

BEGIN TRAN

INSERT INTO Table1 VALUES (@Type,@Name,@MainTYpe)
SET @ERROR = @@ERROR
IF @ERROR > 0
BEGIN
GOTO ERRORHANDLE
END

COMMIT TRAN
RETURN 100

ERRORHANDLE:
ROLLBACK TRAN
RETURN -100

GO

EXEC UP_InsertFruit '苹果','A'
EXEC UP_InsertFruit '红富士','A-01'

SELECT * FROM TABLE1

TypeID TypeName ParentID
A 苹果
A-01 红富士 A
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
原表
TypeID TypeName ParentID
A 快餐 NULL
A-01 肉类 A
A-02 海鲜类 A
A-03 蔬菜 A
B 水果 NULL
B-01 地水果 B
比如我插入一个大类鲜花
那就变成
TypeID TypeName ParentID
A 快餐 NULL
A-01 肉类 A
A-02 海鲜类 A
A-03 蔬菜 A
B 水果 NULL
B-01 地水果 B
C 鲜花 NULL
在水果中中插入新附类别 进口水果
那就变成
TypeID TypeName ParentID
A 快餐 NULL
A-01 肉类 A
A-02 海鲜类 A
A-03 蔬菜 A
B 水果 NULL
B-01 地水果 B
B-02 进口水果 B
C 鲜花 NULL
Alexander 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
啊 SELECT LEFT(@TypeID, 1) + REPLICATE('0', 2-LEN(CONVERT(INT, RIGHT(@MaxTyp , 2))+1))+CONVERT(NVARCHAR(2), CONVERT(INT, RIGHT(@MaxTyp , 2))+1)
END 这一段没有弄对的
是例子上的
[/Quote]
对呢,逻辑上有点瑕疵:

USE [Factory]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: XXX
-- Create date: 2012,4,20
-- Description: 创建物料类别
-- =============================================
CREATE PROCEDURE [dbo].[CreateStoreTypID]
@TypeID NVARCHAR(4),
@TypeName NVARCHAR(50)
AS
BEGIN
DECLARE @MaxTyp NVARCHAR(2) , @ParentID NVARCHAR(4)
SELECT TOP 1 @MaxTyp = TypeID from Mat_TypeInfo where LEFT(TypeID, 1)= @TypeID ORDER BY TypeID DESC
if @MaxTyp = null
--BEGIN
--SELECT ('A')
--END
--ELSE
--BEGIN
--SELECT LEFT(@TypeID, 1) + REPLICATE('0', 2-LEN(CONVERT(INT, RIGHT(@MaxTyp , 2))+1))+CONVERT(NVARCHAR(2), CONVERT(INT, RIGHT(@MaxTyp , 2))+1)
--END
BEGIN
SET @ParentID=null
END
ELSE
BEGIN
SET @ParentID=@TypeID
if @MaxTyp=@TypeID
BEGIN
SET @TypeID=@TypeID+'-01'
END
ELSE
BEGIN
SET @TypeID=@TypeID+'-'+REPLICATE('0', 2-LEN(CONVERT(INT, RIGHT(@MaxTyp , 2))+1))+CONVERT(NVARCHAR(2), CONVERT(INT, RIGHT(@MaxTyp , 2))+1)
END
END
INSERT INTO Mat_TypeInfo VALUES(@TypeID,@TypeName,@PrarentID)
END


十三门徒 2012-04-20
  • 打赏
  • 举报
回复
给几条你插入后的数据,然后说下你想更新成什么样子吧
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

大致明白LZ的意思了,看看在下理解得对不(话说LZ用的头像和我的是同一个人,跑来友情帮顶下,顺便打下酱油-_-):
输入时要输入TypeName和对应的主类别(比如A),如果表里有对应的主类别就生成'A-01'形式的TypeId并使ParentID='A',否则使TypeId='A'而ParentID=null

SQL code

USE [Factory]
GO
SET ANSI_N……
[/Quote]
谢谢你了
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
啊 SELECT LEFT(@TypeID, 1) + REPLICATE('0', 2-LEN(CONVERT(INT, RIGHT(@MaxTyp , 2))+1))+CONVERT(NVARCHAR(2), CONVERT(INT, RIGHT(@MaxTyp , 2))+1)
END 这一段没有弄对的
是例子上的
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
应该说是2列
要不我也觉得没办法完成
注明是大类别
或者注明是那一个大类别中的小类别 就是第三列
十三门徒 2012-04-20
  • 打赏
  • 举报
回复
你往表中插入数据的时候插入几列?就是第二列么不是?
Alexander 2012-04-20
  • 打赏
  • 举报
回复
大致明白LZ的意思了,看看在下理解得对不(话说LZ用的头像和我的是同一个人,跑来友情帮顶下,顺便打下酱油-_-):
输入时要输入TypeName和对应的主类别(比如A),如果表里有对应的主类别就生成'A-01'形式的TypeId并使ParentID='A',否则使TypeId='A'而ParentID=null


USE [Factory]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: XXX
-- Create date: 2012,4,20
-- Description: 创建物料类别
-- =============================================
CREATE PROCEDURE [dbo].[CreateStoreTypID]
@TypeID NVARCHAR(4),
@TypeName NVARCHAR(50)
AS
BEGIN
DECLARE @MaxTyp NVARCHAR(2) , @ParentID NVARCHAR(4)
SELECT TOP 1 @MaxTyp = TypeID
from Mat_TypeInfo
where LEFT(TypeID, 1)= @TypeID
ORDER BY TypeID DESC
if @MaxTyp = null
--BEGIN
--SELECT ('A')
--END
--ELSE
--BEGIN
--SELECT LEFT(@TypeID, 1) + REPLICATE('0', 2-LEN(CONVERT(INT, RIGHT(@MaxTyp , 2))+1))+CONVERT(NVARCHAR(2), CONVERT(INT, RIGHT(@MaxTyp , 2))+1)
--END
BEGIN
SET @ParentID=null
END
ELSE
BEGIN
SET @ParentID=@TypeID
SET @TypeID=@TypeID+'-'+REPLICATE('0', 2-LEN(CONVERT(INT, RIGHT(@MaxTyp , 2))+1))+CONVERT(NVARCHAR(2), CONVERT(INT, RIGHT(@MaxTyp , 2))+1)
END
INSERT INTO Mat_TypeInfo VALUES(@TypeID,@TypeName,@PrarentID)
END

在下手头上没有SQL_SERVER,不能调试,如有笔误还劳烦LZ自己更正了。
xxxcloud 2012-04-20
  • 打赏
  • 举报
回复
26六个字母应该够了
有26个大类别就不错了
我也没找到怎么把sql中的字母增加的
头大了
加载更多回复(13)

34,837

社区成员

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

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