Cách truyền các tham số trong Store Procedure

Trong Store Procedure của bạn có khi bạn cần truyền tham số vào để thực hiện với yêu cầu truy vân thực tế nào đó. Ví dụ khi bạn viết Store và bạn muốn truy vấn Top 10 hay Top 20 bản ghi? Nhưng Tham số Top này lại không cố định không lẽ khi muốn Select top 10 bạn lại viết một câu truy vấn hoặc Srore, Muốn Select Top 20 bạn lại viết một câu truy vấn khác? Điều này có cách thực hiện đó là bạn truyền biết @Top vào trong một Store Procedure.
Nhưng khi bạn khai báo biết @Stop thì bạn cũng không thể sử dụng câu truy vấn Select @Top {Danh sách các trường} from TableName được. Vậy cách thực hiện ở đây là bạn khai báo một biến  (@SQL) và truyền nó vào biến này sau đó thực hiện Execute biến này như ví dụ sau:

Ví dụ 1:

CREATE PROCEDURE spGetTop
    @Top int
AS
BEGIN
    DECLARE @SQL nvarchar(4000) SET @SQL=''
    SET  @SQL =@SQL+ ' SELECT Top '+Cast(@Top AS varchar(12)) +' 
        CustomerID, 
        CompanyName, 
        ContactName, 
        ContactTitle  
            FROM Customers c'
    EXEC   (@SQL)
END

Trong ví dụ trên mình đã tạo một Store để truy vấn các trường CustomerID, CompanyName, ContactName, ContactTitle  của bảng Customers trong cơ sở dữ liệu Northwind. Bạn chú ý là biến truyền vào là kiểu Int nên khi bạn đưa vào biến @SQL là kiểu nvarchar bạn cần thực hiện convert sang varchar bằng hàm Cast. Khi thực thi Store trên: Nếu muốn truy vấn 10 bản ghi bạn EXEC spGetTop 10,Cần truy vấn 20 bản ghi bạn EXEC spGetTop 20.

Một ví dụ khác là bạn có thể truyền tên của bảng cần lấy dữ liệu vào trong Store. Khi bạn viết một Store truy vấn dữ liệu từ một bảng nào đó mà dữ liệu truy vấn từ tên bảng lại có thể thay đổi. Mình lấy ví dụ như sau:

Ví dụ 2:

CREATE PROCEDURE spGetTableName
    @TableName nvarchar(50)
AS
BEGIN
    DECLARE @SQL nvarchar(4000) SET @SQL=''
    SET  @SQL =@SQL+ ' SELECT * FROM '+@TableName
    EXEC   (@SQL)
END

Trong ví dụ 2 này mình minh họa cách truyền tên bảng (@TableName vào trong Store).
- Khi thực thi Store này bạn muốn truy vấn dữ liệu từ bảng Customers bạn thực thi như sau: EXEC spGetTableName 'Customers' .
- Khi bạn muốn truy vấn dữ liệu từ bảng Products bạn thực thi như sau: EXEC spGetTableName 'Products'

Trong ví dụ trên mình minh họa cách truyền Tên bảng Vào Store với Select *. Vậy khi bạn muốn truyền cả tên bảng, cả danh sách các trường cần truy vấn? Ví dụ sau mình sẽ minh họa cho bạn cách truyền cả tên bảng, cả danh sách các trường muốn lấy dữ liệu.

Ví dụ 3:

CREATE PROCEDURE spGetTableNameAndField
    @TenBang nvarchar(50), 
    @DanhSachCacTruong nvarchar(200)
AS
BEGIN
    DECLARE @SQL nvarchar(4000) SET @SQL=''
    SET @SQL='SELECT '+ @DanhSachCacTruong + ' FROM '+@TenBang
    EXEC (@SQL)
END

Giả sử mình muốn truy vấn các trường CustomerID, CompanyName, ContactName, ContactTitle của bảng  Customers bạn thực thi như sau:

EXEC spGetTableNameAndField 'Customers','CustomerID, CompanyName, ContactName, ContactTitle '

Trên đây mình minh họa cách truyền các tham số vào trong Store Procedure để bạn tham khảo. Tùy điều kiện yêu cầu cụ thể của bạn mà bạn thực hiện truyền các tham số cho phụ hợp. Đọc thêm bài viết Quan hệ C# và Database :: Stored Procedure Về Store Procedure