2013-03-03 67 views
23

Tôi đang phát triển một khung công tác, trong đó tôi đang gọi thủ tục được lưu trữ với các tham số được tạo động. Tôi đang xây dựng bộ sưu tập tham số tại thời gian chạy.Tham số thủ tục lưu trữ SQL Server

Sự cố xảy ra khi tôi chuyển một tham số đến quy trình được lưu trữ, nhưng proc được lưu trữ không chấp nhận tham số đó.

Ví dụ, thủ tục lưu trữ của tôi là:

CREATE PROCEDURE GetTaskEvents 
    @TaskName varchar(50) 
AS 
BEGIN 
-- SP Logic 
END 

Gọi thủ tục lưu trữ như:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2 

này ném dưới đây lỗi:

Msg 8144, Level 16, State 2, Procedure GetTaskEvents, Line 0 
Procedure or function GetTaskEvents has too many arguments specified. 

này hoạt động tốt trong Sybase ASE, mà chỉ đơn giản là bỏ qua bất kỳ tham số bổ sung nào. Điều này có thể đạt được với máy chủ MSSQL 2008? Bất kỳ trợ giúp, nhiều đánh giá cao. Cảm ơn

+0

Bạn có thể thực hiện EXEC GetTaskEvents 'TESTTASK' – DevelopmentIsMyPassion

Trả lời

4

Tại sao bạn chuyển một tham số cho quy trình được lưu trữ không sử dụng?

Nghe có vẻ như tôi có thể tốt hơn trong việc xây dựng các câu lệnh SQL động và sau đó thực thi chúng. Những gì bạn đang cố gắng làm với SP sẽ không hoạt động, và thậm chí nếu bạn có thể thay đổi những gì bạn đang làm theo cách để chứa số lượng tham số khác nhau, thì về cơ bản bạn sẽ sử dụng SQL được tạo động, bạn đang đánh bại mục đích của có/sử dụng một SP ở nơi đầu tiên. SP có vai trò, nhưng không có giải pháp trong mọi trường hợp.

27

Máy chủ SQL không cho phép bạn chuyển các tham số đến một quy trình mà bạn chưa xác định. Tôi nghĩ rằng gần nhất bạn có thể tới loại thiết kế này là sử dụng các thông số tùy chọn như vậy:

CREATE PROCEDURE GetTaskEvents 
    @TaskName varchar(50), 
    @ID int = NULL 
AS 
BEGIN 
-- SP Logic 
END; 

Bạn sẽ cần phải bao gồm mỗi tham số có thể là bạn có thể sử dụng trong định nghĩa. Sau đó, bạn muốn được tự do để gọi thủ tục trong hai cách:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2; 
EXEC GetTaskEvents @TaskName = 'TESTTASK'; -- @ID gets NULL here 
2

Tôi đang xảy ra một chút của một giả định ở đây, nhưng tôi giả định logic bên trong thủ tục bị chia tay thông qua nhiệm vụ. Và bạn không thể có tham số nullable như @Yuck được đề xuất vì tính năng động của các tham số?

Vì vậy, đi theo giả thiết của tôi

If TaskName = "Path1" Then Something

If TaskName = "Path2" Then Something Else

suy nghĩ ban đầu của tôi là, nếu bạn có chức năng riêng biệt với kinh doanh logic bạn cần phải tạo ra và bạn có thể xác định rằng bạn có nói 5-10 kịch bản khác nhau, chứ không phải viết các thủ tục được lưu trữ riêng lẻ khi cần thiết, thay vì thử một giải pháp lớn nhất phù hợp với mọi cách tiếp cận. Có thể có một chút lộn xộn để duy trì.

Nhưng nếu bạn phải ...

Tại sao không thử SQL động, theo đề nghị của @E.J Brennan (Hãy tha thứ cho tôi, tôi đã không đụng SQL trong một thời gian rất cú pháp của tôi có thể là gỉ) Điều đó đang được nói i don 't biết nếu nó là cách tiếp cận tốt nhất, nhưng điều này có thể có thể đáp ứng nhu cầu của bạn?

CREATE PROCEDURE GetTaskEvents 
    @TaskName varchar(50) 
    @Values varchar(200) 
AS 
BEGIN 
    DECLARE @SQL VARCHAR(MAX) 

    IF @TaskName = 'Something' 
    BEGIN 
    @SQL = 'INSERT INTO.....' + CHAR(13) 
    @SQL += @Values + CHAR(13) 
    END 

    IF @TaskName = 'Something Else' 
    BEGIN 
    @SQL = 'DELETE SOMETHING WHERE' + CHAR(13) 
    @SQL += @Values + CHAR(13) 
    END 

    PRINT(@SQL) 
    EXEC(@SQL)  
END 

(CHAR (13) thêm dòng mới ..một habbit cũ tôi nhặt ở đâu đó, được sử dụng để giúp gỡ rối/đọc thủ tục năng động khi chạy SQL Profiler.)

0

xin vui lòng sử dụng như thế này Exec GetTaskEvents @paramOne, @parmTwo, @ParamN

1
CREATE PROCEDURE GetTaskEvents 
@TaskName varchar(50), 
@Id INT 
AS 
BEGIN 
-- SP Logic 
END 

Thủ tục gọi

DECLARE @return_value nvarchar(50) 

EXEC @return_value = GetTaskEvents 
     @TaskName = 'TaskName', 
     @Id =2 

SELECT 'Return Value' = @return_value 
0

bạn đang phân tích các thông số sai combination.here bạn đi qua @TaskName =@ID thay vì @TaskName = .SP cần chỉ có một tham số.

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