27,579
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE test
(
stu_no int,
stu_name varchar(20),
stu_score float
)
INSERT INTO test
SELECT 1,'张三',70 UNION
SELECT 2,'李四',80 UNION
SELECT 3,'王五',60
/*************
要求如:如第二个字段为‘张三’,则这条数据拆分为N条
写一函数
CREATE FUNCTION fn_b_gettable
(
@stu_name varchar(20),
@stu_count int
)
RETURN TABLE
...............
CREATE TABLE test
(
stu_no int,
stu_name varchar(20),
stu_score float
)
INSERT INTO test
SELECT 1,'张三',70 UNION
SELECT 2,'李四',80 UNION
SELECT 3,'王五',60
GO
CREATE FUNCTION fn_b_gettable
(
@stu_no int,
@stu_name varchar(20),
@stu_count int
)
RETURNS @t TABLE
(
stu_no int,
stu_name varchar(20),
stu_count int
)
AS
BEGIN
DECLARE @i int
SET @i = 1
WHILE(@i <= @stu_count)
BEGIN
INSERT INTO @t SELECT @stu_no,@stu_name,@stu_count
SET @i = @i + 1
END
RETURN
END
GO
SELECT * FROM dbo.fn_b_gettable(1,'张三',5)
SELECT a.*
FROM test a join master..spt_values b ON b.[type] = 'p' and b.number between 1 and a.stu_score
DROP FUNCTION fn_b_gettable
DROP TABLE test
/*
stu_no stu_name stu_count
----------- -------------------- -----------
1 张三 5
1 张三 5
1 张三 5
1 张三 5
1 张三 5
(5 行受影响)
stu_no stu_name stu_score
----------- -------------------- ----------------------
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
2 李四 80
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
3 王五 60
(210 行受影响)
--这样用是不行的
select *,dbo.fn_b_gettable(stu_name,7) from test
--可以这样用
select * from dbo.fn_b_gettable('张三',7)
union all
select * from dbo.fn_b_gettable('李四',3)
union all
select * from dbo.fn_b_gettable('王五',4)
/*
stu_no stu_name stu_score
----------- -------------------- ----------------------
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
2 李四 80
2 李四 80
2 李四 80
3 王五 60
3 王五 60
3 王五 60
3 王五 60
*/
create FUNCTION fn_b_gettable
(
@stu_name varchar(20),
@stu_count int
)
RETURNs @t TABLE ( stu_no int,stu_name varchar(20), stu_score float)
as
begin
declare @i int
set @i=1
while(@i<=@stu_count)
begin
insert into @t
select * from test where stu_name=@stu_name
set @i=@i+1
end
return
end
select * from dbo.fn_b_gettable('张三',7)
/*
stu_no stu_name stu_score
----------- -------------------- ----------------------
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
1 张三 70
*/
select replicate(stu_name,stu_no) from test
/*
张三
李四李四
王五王五王五
*/