Trang 1 / 4 1234 LastLast
Hiển thị kết quả từ 1 đến 10 / 37
  1. #1
    Tham gia
    01-09-2004
    Location
    TP Hồ Chí Minh
    Bài viết
    428
    Like
    0
    Thanked 0 Times in 0 Posts

    Cho mình hỏi về Stored Procedure

    Các bạn giúp mình với . Mình chỉ mới làm quen với Ms SQL Server 2000
    Mình muốn hỏi cách viết Stored Procedured cho thuộc tính Customer_ID trong bảng Customer có thể tự động sinh ra (lưu ý các bạn là tạo ra từ Stored Procedure chứ không dùng Identity)
    Quote Quote

  2. #2
    Tham gia
    02-12-2004
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    tôi ko hiểu ý của bạn cho lắm. Bạn muốn sinh ra một khoá ngẫu nhiên cho bảng Customer pk?. Bạn có thể viết một hàm trong ngôn ngữ lập trình để tạo ID theo công thức của bạn rồi insert vào bằng ngôn ngữ lập trình. Còn nếu bạn muốn sài Store Procedure nghĩa là bạn sẽ truyền vào các thông tin của khách hàng và store đó sẽ tự phát sinh ID và insert vào bảng Customer pk? Cái đó bạn cũng phải tự viết cách thức tạo ra ID trong Store chứ(bạn xem thêm trong Book online của SQL để biết sử dụng các câu lệnh trong SQL) dưới đây chỉ là minh họa.

    CREATE procedure sp_InsertCustomer
    (
    @CustomerName varchar(50),
    @CustomerAddress varchar(255)
    )
    As

    Declare @CustomerID VarChar(10)

    --Các câu lệnh để sinh ra CustomerID
    .......

    Insert into Customer(CustomerID, CustomerName, CustomerAddress)
    Values(@CustomerID, @CustomerName, CustomerAddress)


    return

  3. #3
    Tham gia
    01-09-2004
    Location
    TP Hồ Chí Minh
    Bài viết
    428
    Like
    0
    Thanked 0 Times in 0 Posts
    Bạn ơi chỉ cho mình cụ thể cách viết câu lệnh sinh ra CustomerId với . Ví dụ như mỗi lần mình Insert 1 record thì CustomerID sẽ tự sinh ra có dạng : C001, C002 ,C003 , C004 ....
    Cám ơn bạn rainsorrow

  4. #4
    Tham gia
    19-02-2004
    Bài viết
    43
    Like
    0
    Thanked 0 Times in 0 Posts
    Cái này chưa chuẩn lắm nhưng cũng dùng tạm được nè
    CREATE PROCEDURE sp_insertkhachhang
    @customerid varchar(50),
    @customername varchar(50)
    AS
    declare @sotang int
    set @sotang =(select count(*) as sobanghi from khachhang)
    set @customerid ='C00'+convert(varchar,@sotang)
    insert into khachhang(customerid,customername) values(@customerid,@customername)
    GO

    Table khách hàng KHACHHANG(customerid,...)
    Goi thu tuc execute sp_insertkhachhang '','caca'
    Được sửa bởi Nguyen Thi Hoai lúc 12:52 ngày 24-02-2005

  5. #5
    Tham gia
    20-12-2008
    Bài viết
    3
    Like
    0
    Thanked 0 Times in 0 Posts
    Cám ơn bạn nhiều nhé

  6. #6
    Tham gia
    20-08-2007
    Location
    Đà Nẵng
    Bài viết
    6
    Like
    0
    Thanked 0 Times in 0 Posts
    Ý kiến bạn "Nguyen Thi Hoai" là rất tốt, tuy nhiên để đạt hiệu quả cao nhất bạn vẫn nên thêm vài dòng code vào procedure để tránh ngoại lệ, chẳng hạn như trong trường hợp bạn xoá bớt một record ngẫu nhiên thì record mới tạo ra nhiều khả năng sẽ trùng với record gần nhất!
    Vì pk của bạn không identity nên cách tốt nhất vẫn nên làm ở code behind. Quá nhiều truy vấn sẽ làm tăng thời gian xử lý cho câu sql cũng như câu lệnh không còn trong sáng.

    Chúc bạn thành công!

  7. #7
    Tham gia
    27-09-2008
    Location
    http://www.encysoft.com
    Bài viết
    1,351
    Like
    11
    Thanked 14 Times in 12 Posts
    Bạn dùng câu lệnh select MAX(Customer_ID) thay vì count. Sau khi có kết quả thì cộng thêm 1 để làm Customer_ID mới.

  8. #8
    Tham gia
    20-04-2010
    Location
    Hà Nôi
    Bài viết
    23
    Like
    0
    Thanked 0 Times in 0 Posts
    Nếu như làm theo của bạn Hoài, thì nghĩ sao trong trường hợp này:
    Tôi insert 10 bản ghi đầu tiên OK rồi, sau đó tôi xóa bản ghi thứ 9 đi. Lúc này tôi sẽ có 9 bản ghi với bản ghi cuối cùng là C0010( sẽ là như thế nếu như đúng cơ chế đó của bạn Hoài). Và bây giờ tôi tiếp tục thêm một bản ghi mới thứ 10? Liệu có bị trùng Primary key hay ko?

  9. #9
    Tham gia
    20-02-2009
    Location
    Ninh Bình
    Bài viết
    567
    Like
    0
    Thanked 34 Times in 31 Posts
    Nếu không muốn dùng Identity, thì phương án thường dùng là phải có một bảng dành riêng cho việc lấy số thứ tự. Bảng này có cấu trúc như nhau:

    Code:
    Create Table IDENTITY_CONTROL
    (
        ten_bang  NVARCHAR(128),
        so_thu_tu BIGINT DEFAULT(0)
    )

    Khi muốn lấy một số thứ tự, thí dụ như C001, thì phải thực thi những điều sau:

    1. Khóa bảng (hay khóa bản ghi có ten_bang muốn lấy số thứ tự)
    2. Nếu không khóa được vì có người đã khóa trước, thì đợi 5/1000 giây, và lặp lại bước #1.
    3. Nếu khóa được, lấy số thứ tự, tăng thêm 1, và cập nhật cột so_thu_tu với số đã tăng.


    Thường thì bạn chỉ cần có một SP với tham số là tên bảng để xử lý những thao tác trên. SP này trả về một kết quả duy nhất là số thứ tự cho một bảng (qua tham số). Với phương cách này, bạn có thể hổ trợ cho một CSDL có nhiều người cập nhật cùng một lúc.

    Đơn giản thế thôi. Đây cũng là phương án mà nhiều nhóm lập trình gia ưa chuộng, vì dùng IDENTITY có rất nhiều trở ngại trong việc bảo quản CSDL.

  10. #10
    Tham gia
    02-05-2010
    Bài viết
    1
    Like
    0
    Thanked 0 Times in 0 Posts
    Mình dùng store procedure như cách các bạn chỉ để tự động sinh Mã cho học sinh bằng cách lấy 2 ký tự cuối của năm vào học nối với số tăng dần
    ví dụ :
    Học sinh Nguyễn Văn A có năm vào học là 2001 thì có mã là 01001
    Học sinh Nguyễn Văn B có năm vào học là 2001 thì có mã là 01002
    Học sinh Nguyễn Văn C có năm vào học là 2002 thì có mã là 02001
    Học sinh Nguyễn Văn D có năm vào học là 2002 thì có mã là 02002

    Nhưng khi insert dữ liệu vào thì bị lỗi. Đoạn mã của mình như sau
    Code:
    CREATE TABLE HOCSINH
    (
       MAHS VARCHAR(5) PRIMARY KEY,
       TENHS NVARCHAR (50) NOT NULL,
       NAMVAOHOC VARCHAR(4) NOT NULL
    )
    GO
    CREATE PROC PROC_TAOMAHS @MATAO VARCHAR(5) OUTPUT
    AS
    IF NOT EXISTS (SELECT * FROM HOCSINH) SELECT @MATAO = '00000'
    ELSE
       DECLARE @NAMVAOHOC VARCHAR(4)
       SELECT @MATAO= MAX(RIGHT(MAHS,3)) FROM HOCSINH WHERE LEFT(MAHS,2) = RIGHT(@NAMVAOHOC,2)
       SELECT @MATAO =
       CASE
          WHEN @MATAO >=0 AND @MATAO <9 THEN RIGHT(@NAMVAOHOC,2) +'00'+ CONVERT(VARCHAR,@MATAO + 1)
          WHEN @MATAO >=9 AND @MATAO <99 THEN RIGHT(@NAMVAOHOC,2)+ '0'+ CONVERT(VARCHAR,@MATAO + 1)
          WHEN @MATAO >=99 AND @MATAO <999 THEN RIGHT(@NAMVAOHOC,2) + CONVERT(VARCHAR,@MATAO + 1)
    END
    GO
    CREATE PROC PROC_THEMHS @TENHS NVARCHAR(50),@NAMVAOHOC VARCHAR(4)
    AS BEGIN
       DECLARE @MATAO VARCHAR(5)
       EXEC PROC_TAOMAHS @MATAO OUTPUT
       INSERT INTO HOCSINH (MAHS,TENHS,NAMVAOHOC) VALUES (@MATAO,@TENHS,@NAMVAOHOC)
    END
    GO
    EXEC PROC_THEMHS 'Nguyễn Văn A','2001'

Trang 1 / 4 1234 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •