[SQL] 20 Dạng Thủ Tục và Hàm Cơ Bản

create database ThuTuc
--Phần 1
--Câu 1:
--Tạo bảng học sinh
use ThuTuc;
create table Hocsinh
(MaHS varchar(10), HoDem nvarchar(20), Ten nvarchar(10),
NgaySinh date, NoiSinh nvarchar(50), DiemDauVao float)

--Câu 2:
--Tạo thủ tục để nhập dữ liệu cho bảng
use ThuTuc;
create procedure NhapDLHS
(@MaHS varchar(10), @HoDem nvarchar(20), @Ten nvarchar(10),
@NgaySinh date, @NoiSinh nvarchar(50), @DiemDauVao float)
as
insert into Hocsinh
values(@MaHS,@HoDem,@Ten,@NgaySinh,@NoiSinh,@DiemDauVao)

exec NhapDLHS '101',N'Tạ Văn','Anh','2-1-1992',N'Hà Nội',12
select * from Hocsinh

--Câu 3:
--Viết thủ tục đưa ra thông tin về học sinh
--có điểm đầu vào bằng hoặc lớn hơn số điểm của người dùng đưa ra


create procedure ThongTinHS
(@diem float)
as
select MaHS as N'Mã học sinh',HoDem+' '+Ten as N'Họ và tên',
Ngaysinh as N'Ngày sinh', noisinh as N'Nơi sinh'
from Hocsinh
where DiemDauVao <= @diem

exec ThongTinHS 11
--Câu 4:
--Viết thỉ tục xoá những học sinh có điểm đầu vào nằm giữa hai mức do người dùng đặ ra

create procedure XoaHS
(@tu float, @den float)
as
delete from Hocsinh
where DiemDauVao between @tu and @den

exec XoaHS 12,16
--Câu 5:
--Viết thủ tuch sửa lại nơi sinh theo yêu cầu của người dùng cho
--học sinh có mã theo yêu cầu của người dùng

create procedure SuaNoiSinh
(@ma varchar(15),@noisinh nvarchar(50))
as
update Hocsinh
set
NoiSinh=@noisinh
where MaHS=@ma
exec SuaNoiSinh '101',N'Thái Nguyên'
select * from Hocsinh
--Câu 6:
--Nhập vào số ngày công đã làm và tiền công.
--Tính lương, nếu số ngày công >20 thì từ ngày 21 trở đi tiền công tính hệ số 1.25

create procedure TinhTienCong
(@ngay int, @luong money)
as
declare @tien money
if @ngay < 21
set @tien = @ngay*@luong
else set @tien = (@ngay*@luong+(@ngay-20)*@luong*1.25)
print N'Tiền lương là: '+cast(@tien as varchar(50))

alter procedure TinhTienCong
(@ngay int, @luong money)
as
declare @tien money
if @ngay < 21
set @tien = @ngay*@luong
else set @tien = (
20*@luong+(@ngay-20)*@luong*1.25)
print N'Tiền lương là: '+cast(@tien as varchar(50))

exec TinhTienCong 22,1
--Câu 7:
--Viết chương trình tìm các số có hai chữ số dạng ab mà a+b=a*b


alter procedure AB
as
declare @a int, @b int, @c varchar(30)
set @a=1
set @b=0
set @c=''
while @a between 1 and 9
begin
while @b between 0 and 9
begin
if @a+@b=@a*@b
set @c=cast(@a*10+@b as varchar(2))
set @b=@b+1
end
set @a=@a+1
end
print N'Kết quả cần tìm là:
'+@c+' '
exec AB

drop procedure AB

--Câu 8:
--Lập trình đọc từ bàn phím 4 số nguyên
--Đếm các số chẵn và tính tổng các số chẵn

alter proc Cau8
(@a int, @b int, @c int, @d int)
as
declare @tong int , @i int
set @tong=0
set @i=0
if @a%2 =0
begin
set @i=@i+1
set @tong=@tong+@a
end
if @b%2 =0
begin
set @i=@i+1
set @tong=@tong+@b
end
if @c%2 =0
begin
set @i=@i+1
set @tong=@tong+@c
if @d%2 =0
begin
set @i=@i+1
set @tong=@tong+@d
end
end 
print N'Số lượng số chẵn là: '+cast(@i as varchar(2))
+ N' Tổng các số chẵn là: '+cast (@tong as varchar(10))

exec Cau8 121,21,4,5
--Câu 9:
--Tìm ước chung của 2 số nhập vào

create proc UCLN
(@a int, @b int)
as
while (@a!=@b)
if (@a>@b)set @a=@a-@b
else set @b=@b-@a
print N'UCLN là '+cast(@a as varchar(10))

exec UCLN 8,12
--Câu 10:
--Viết 1 thủ tục nhập vào 2 số ở dạng tử số và mẫu số sau đó đưa ra phân số tối giản

alter proc RutGon
(@a int, @b int)
as
declare @m int, @n int
set @m=@a
set @n=@b
while (@a!=@b)
if (@a>@b)set @a=@a-@b
else set @b=@b-@a
print cast(@m as varchar(10))+'/'+cast(@n as varchar(10))+' = '
+cast(@m/@a as varchar(10))+'/'+cast(@n/@a as varchar(10))

exec rutgon 6,8
--Câu 11:
--Nhập vào 2  số nguyên, tìm BCNN

create proc BCNN
(@a int,@b int)
as
declare @m int, @n int
set @m=@a
set @n=@b
while (@a!=@b)
if (@a>@b)set @a=@a-@b
else set @b=@b-@a
print N'BCNN của '+cast(@m as varchar(10))+N' và '+cast(@n as varchar(10))
+N' là: '+cast(@m*@n/@a as varchar(10))

exec BCNN 6,8
--Câu 12:
--Viết thủ tục tính N giai thừa
create procedure GiaiThua
(@n int)
as
declare @i int, @s int
set @i=1;
set @s=1
while @i<
=@n
begin
set @s=@s*@i
set @i=@i+1
end
print cast(@n as varchar(10))+'! = '+cast(@s as varchar(30))

exec GiaiThua 10
--Câu 13:
--Viết thủ tục đưa ra các ước của N

create proc TimUoc
(@N int)
as
declare @uoc varchar(100), @i int
set @i=1
set @uoc=''
while (@i<@N)
begin
if @N%@i=0 set @uoc=@uoc+CAST(@i as varchar(10))+' '
set @i=@i+1
end
print N'Các ước của '+cast(@n as varchar(10))+N' là:
'+@uoc
exec TimUoc 64

--Câu 14:
--Viết thủ tục đưa ra số ngày tháng

create proc SoNgay
(@Thang int, @nam int)
as
declare @ngay int
if (@Thang between 1 and 12)
begin
set @ngay=
case
when @thang in (1,3,5,7,8,10,12) then 31
when @thang in (4,6,9,11) then 30
when @thang = 2 and @nam%4 =0 then 29
else 28
end
print N'Tháng '+cast(@thang as varchar(2))+N' năm '+cast(@nam as varchar(10))
+N' có '+cast(@ngay as varchar(2))+N' ngày'
end
else print N'Bạn nhập sai tháng'

exec SoNgay 13,12
--Câu 15:
--Viết thủ tục tính tổng
--S=2+4+6+...+n  nếu n chẵn
--S=2+4+6+...+(n-1)  nếu n lẻ
use ThuTuc
create procedure TinhTong
(@n int)
as
declare @i int, @tong int
set @i =2
set @tong=0
if @n%2!=0 set @n=@n-1
while @i<
=@n
Begin
set @tong=@tong+@i
set @i=@i+2
end
return @tong


declare @a int
exec @a= TinhTong 4
 print @a

 --Câu 16
 --Viết thủ tục kiểm tra một số có phải số nguyên tố hay không

 create procedure NguyenTo
 (@n int)
 as
 declare @i int=2,@kt bit
 while @i<
=@n/2
 begin
 if @n%@i=0 set @kt=1 else set @kt=0
 if @kt=1 break
 set @i=@i+1
 end
 if @kt=1 print cast(@n as varchar(20))+N' không phải là số nguyên tố'
 else print cast(@n as varchar(20))+N' là số nguyên tố'

 exec NguyenTo 5





 --Phần 2
 --Phần 2
 --Phần 2
 --Phần 2
 --Phần 2
 --Phần 2

 --Câu 1:
 --Viết thủ tục nhập vào hai số a,b và phép tính đưa ra kết quả
 --Dùng lệnh xuất dữ liệu bên trong thủ tục

 create procedure Pheptinh
 (@a float, @b float, @dau varchar(1))
 as
 declare @kq varchar(20)
 set @kq=
 case
 when @dau='+' then  @kq=cast(@a+@b as varchar(20))
 when @dau='-' then  @kq=cast(@a-@b as varchar(20))
 when @dau='*' then  @kq=cast(@a*@b as varchar(20))
 when @dau='/' then if (@b!=0)set @kq=cast(@a/@b as varchar(20)) else set @kq='Không chia được cho 0'
 when @dau='%' then if (@b!=0) set @kq=cast(@a%@b as varchar(20)) else set @kq='Không chia được cho 0'
 else set @kq='Mời bạn nhập lại phép tính'
 end
 print +cast(@a as varchar(10))+@dau+cast(@b as varchar(10))+' =
'+@kq

 exec Pheptinh 1,2,'-'

 --Câu 2:
 --Viết thủ tục đưa ra số ngày của tháng trong năm dùng output

alter proc SoNgayOutput
 (@Thang int, @nam int,@ngay int output)
as
if (@Thang between 1 and 12)
begin
 set @ngay=
 case
  when @thang in (1,3,5,7,8,10,12) then 31
  when @thang in (4,6,9,11) then 30
  when @thang = 2 and @nam%4 =0 then 29
   else 28
 end
end
else
 print N'Bạn nhập sai tháng'

declare @a int
exec SoNgayOutput 12,2000,@a output
print @a

 --Câu 3:
 --Viết thủ tục kiểm tra một số có phải là số nguyên tố hay không sử dụng return

 alter proc NguyenToR
 (@n int)
 as
 declare @i int, @kq nvarchar(50), @kt bit
 set @i=2
 set @kt=0
 while(@i<@n/2)
 begin
 if @n%@i=0 set @kt=1
 set @i=@i+1
  end
 if @kt=0 set @kq=CAST(@n as varchar(10))+N' là số nguyên tố'
 else set @kq=CAST(@n as varchar(10))+N' không phải là số nguyên tố'
 return @kq

 exec NguyenToR 6

 --Câu 8:
 --Viết thủ tục tìm số hoàn hảo từ 2 đến N

alter proc SoHoanHao
 (@N int)
 as
 declare @i int,@a int, @t int, @kq varchar(100)
 set @a=1
  set @kq=''
 while (@a<
=@N)
 begin
 set @i=1
 set @t=0
 while (@i<@a)
 begin
 if @a%@i=0 set @t=@t+@i
  set @i=@i+1
 end
 if @a=@t set @kq=@kq +cast(@a as varchar(10))+' '
 set @a=@a+1
 end
 print N'Các số hoàn hảo nhỏ hơn '+cast(@n as varchar(10))+N' là:
'+@kq

 exec SoHoanHao 1249


 --Số hoàn hảo
 alter proc SoHoanHaoR
 (@N int)
 as
 declare @i int, @t int, @kq nvarchar(100)
  set @kq=''
 set @i=1
 set @t=0
 while (@i<@N)
 begin
 if @N%@i=0 set @t=@t+@i
  set @i=@i+1
 end
 if @N=@t set @kq=cast(@N as varchar(10))+N' là số hoàn hảo'
 else set @kq=cast(@N as varchar(10))+N' không phải là số hoàn hảo'
 return @kq

 exec SoHoanHaoR 6
 



Nhãn bài viết:
Blog, Updated at: 23:43