2010-03-21 22 views
13

Tôi đã sử dụng SQL Server 2005 cho ứng dụng web nhỏ của mình. Tôi muốn truyền tham số cho SP. Nhưng có một điều kiện. số tham số có thể thay đổi theo thời gian. suy nghĩ, thời gian này tôi vượt qua tên và địa chỉ, thời gian tới tôi vượt qua họ, tên, địa chỉ,Làm thế nào để vượt qua một số biến của các tham số cho một thủ tục lưu trữ SQL Server?

phạm vi thông số này có thể là 1-30,

Trả lời

6

Bạn có thể thiết lập các giá trị mặc định cho các thông số ở các SP để các tham số trở thành tùy chọn.

ví dụ:

CREATE PROCEDURE dbo.Test 
@param1 int, -- Not an optional 
@param2 int = 10, --Optional 
@param3 bit = 0, --Optional 
@param4 varchar(50) = '', --Optional 
@param5 nvarchar(100) = null --Optional 
-- more parameters ..... 
AS 
BEGIN 

-- The SQL goes here... 

END 

Sau đó, bạn có thể điền thông số tùy chọn theo lựa chọn của mình.

12

Bạn khai báo thủ tục với các thông số mặc định và bạn gọi nó với tên là tham số thay vì tham số vị trí:

CREATE PROCEDURE usp_myProcedure 
    @name varchar(100) = '', 
    @surname varchar(100) = '', 
    @address varchar(100) = '' 
AS 
BEGIN 
... 
END 

để gọi nó từ T-SQL:

exec usp_myProcedure @name='John', @surname = 'Doe'; 
exec usp_myProcedure @name='Jane', @address = '123 Anystreet'; 

Để gọi nó từ C# :

SqlCommand cmd = new SqlCommand('usp_MyProcedure', ...); 
cmd.CommandType = commandtype.StoredProcedure; 
cmd.Parameters.AddWithValue('@name', 'John'); 
cmd.Parameters.AddWithValue('@surname', 'Doe'); 
10

Bạn có thể sử dụng các loại XML. Đây là một quy trình mẫu:

 
CREATE PROCEDURE udsp_VariableParams(@params XML) 
AS 
BEGIN 
    DECLARE @vdoc INT 
    EXEC sp_xml_preparedocument @vdoc OUTPUT, @params 
    SELECT * FROM OPENXML(@vdoc, '/params/param', 1) WITH ([paramname] VARCHAR(40), [paramvalue] VARCHAR(150)) 
    EXEC sp_xml_removedocument @vdoc  
END 

EXEC udsp_VariableParams 
    '<params> 
    <param paramname="name" paramvalue="value"/> 
    <param paramname="address" paramvalue="value"/> 
    </params>' 

EXEC udsp_VariableParams 
    '<params> 
    <param paramname="name" paramvalue="value"/> 
    <param paramname="surname" paramvalue="value"/> 
    <param paramname="address" paramvalue="value"/> 
    </params>' 
+2

Tôi nghĩ rằng điều này là quá mức cần thiết cho vấn đề OP - nhưng nghĩ rằng nó có thể thực sự hữu ích cho một vấn đề tôi hiện đang có! :) Cảm ơn! +1 –

1

Chuẩn bị và trích xuất thẻ từ XML là kẻ giết người thực hiện tốt. Thời gian thực hiện không nhất quán phụ thuộc vào việc kế hoạch có được lưu trữ hay không.

Sử dụng NVARCHAR (MAX) thay thế là một lựa chọn tốt hơn. Chỉ cần chuẩn bị cho bạn chuỗi tham số với cặp "@ name = Value" và thêm một sepearetor tham số duy nhất nếu cần. Bên trong quy trình sử dụng SUBSTRING, CHARINDEX, v.v. để nhận các tham số riêng lẻ.

Các vấn đề liên quan