2016-04-18 20 views
8

Hãy xem xét các đoạn mã T-SQL sau:T-SQL thủ tục lưu trữ - Phát hiện nếu một tham số được cung cấp như OUTPUT

CREATE PROC dbo.SquareNum(@i INT OUTPUT) 
AS 
BEGIN 
    SET @i = @i * @i 
    --SELECT @i 
END 
GO 

DECLARE @a INT = 3, @b INT = 5 
EXEC dbo.SquareNum @a OUTPUT 
EXEC dbo.SquareNum @b 
SELECT @a AS ASQUARE, @b AS BSQUARE 
GO 
DROP PROC dbo.SquareNum 

Tập kết quả là:

ASQUARE  BSQUARE 
----------- ----------- 
9   5 

Như có thể thấy, @b không được vuông, b/c nó đã không được thông qua trong khi tham số đầu ra (không OUTPUT vòng loại khi đi qua trong tham số).

Tôi muốn biết nếu có cách nào tôi có thể kiểm tra trong cơ thể thủ tục được lưu trữ (cơ thể dbo.SquareNum trong trường hợp này) để xem liệu tham số có thực sự được chuyển thành tham số OUTPUT không?

+0

tôi không nghĩ rằng bạn có thể làm điều đó. –

+0

Tôi đồng ý với Giorgi - đừng nghĩ rằng bạn có thể kiểm tra điều đó trong thời gian chạy. Nếu bạn lo lắng về việc thực thi nó, bạn có thể muốn làm điều này như một hàm vô hướng trả về giá trị mới thay vì sử dụng một thủ tục. –

+1

Câu hỏi thú vị. Tôi không có câu trả lời, nhưng vì tò mò, tại sao bạn lại muốn làm điều này? Tôi tự hỏi nếu có một vấn đề cơ bản có thể được giải quyết theo một cách khác. –

Trả lời

0

Bạn có thể làm điều này bằng cách truy vấn để xem sys:

select 
    p.name as proc_name, 
    par.name as parameter_name, 
    par.is_output 
from sys.procedures p 
inner join sys.parameters par on par.object_id=p.object_id 
where p.name = 'SquareNum' 

hoặc kiểm tra trong Management Studio trong cây cơ sở dữ liệu: [cơ sở dữ liệu] -> Khả năng lập trình -> Stored Procedure -> [thủ tục] -> Thông số

+6

Tôi nghĩ câu hỏi là về làm thế nào để phát hiện xem 'cái OUTPUT' từ khóa được sử dụng trong mã gọi thủ tục lưu trữ, không phải về định nghĩa thủ tục lưu trữ. –

0

lẽ tôi là sai nhưng tôi không tin rằng đó là có thể. OUTPUT là một phần của định nghĩa thủ tục lưu sẵn, do đó bạn nên biết khi nào một tham số là hoặc không phải là OUTPUT. Không có cách nào để thiết lập nó tự động vì vậy tôi nghĩ rằng nó là vô nghĩa để xác định bởi mã khi một tham số là đầu ra hay không vì bạn đã biết nó.

Nếu bạn đang cố gắng để viết một mã năng động, câu trả lời Piotr Lasota của nên lái xe bạn một cách chính xác để nhận ra khi một tham số là Output.

0

Sử dụng các truy vấn sau đây để có được tên của tất cả các thông số và kiểm tra nếu nó là một tham số đầu ra :::

select name, is_output from sys.parameters 
1
------ THIS WILL GIVE YOU THE BOTH VALUE IN squared------ 

    CREATE PROC dbo.SquareNum(@i INT OUTPUT) 
    AS 
    BEGIN 
     SET @i = @i * @i 
     --SELECT @i 
    END 
    GO 

    DECLARE @a INT = 3, @b INT = 5 
    EXEC dbo.SquareNum @a OUTPUT 
    EXEC dbo.SquareNum @b OUTPUT 
    SELECT @a AS ASQUARE, @b AS BSQUARE 
    GO 
    DROP PROC dbo.SquareNum 


    -----TO CHECK STORED PROCEDURE BODY----- 

    SELECT OBJECT_NAME(object_id), 
      OBJECT_DEFINITION(object_id) 
    FROM sys.procedures 
    WHERE OBJECT_DEFINITION(object_id) =(SP_NAME) 
-1

để xem thủ tục lưu trữ cơ thể

sp_helptext exec ' '

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