5

Tôi có Bảng do người dùng xác định mà tôi chuyển vào một thủ tục được lưu trữ từ bên trong một thủ tục được lưu trữ.Vượt qua một bảng do người dùng định nghĩa đến một thủ tục được lưu trữ

DECLARE @tmpInput MyTableType; 

--Table is populated from an INPUT XML 

exec ValidateInputXML SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute'; 

Hiện tại, điều này không gây ra lỗi cho tôi, nhưng khi tôi chạy lựa chọn từ ValidateInputXML, bảng không có dữ liệu.

Trả lời

10

Bạn cũng có thể sử dụng tham số bảng giá trị cho bạn được lưu trữ thủ tục. Ví dụ:

/* Create a table type. */ 
CREATE TYPE MyTableType AS TABLE 
(Column1 VARCHAR(50) 
, ........); 
GO 

/* Create a procedure to receive data for the table-valued parameter. */ 
CREATE PROCEDURE dbo. ValidateInputXML 
    @TVP MyTableType READONLY 
    AS 
    -- Do what ever you want to do with the table received from caller 
    GO 

/* Declare a variable that references the type. */ 
DECLARE @myTable AS MyTableType; 

-- Fill @myTable with data and send it to SP. 
insert into @myTable SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute'; 


/* Pass the table variable data to a stored procedure. */ 
EXEC ValidateInputXML @myTable ; 
GO 
+0

Tôi không biết nếu bạn có thể vượt qua các recordset trực tiếp đến các thủ tục lưu trữ mà không sử dụng các loại bảng. Cho nó một ý nghĩ khác. – vendettamit

+1

Đây là phong cách của giải pháp mà chúng tôi đã thực hiện. – Steven

0

Phạm vi của bảng do người dùng xác định nằm trong quy trình được lưu trữ. Khi thủ tục được lưu trữ được thực thi, bảng @tmpInput được tạo và điền và sau đó bạn không thể truy cập thủ tục đó.

Từ các tài liệu:

Phạm vi của một biến kéo dài từ điểm nó được khai báo cho đến khi cuối đợt hoặc thủ tục lưu trữ, trong đó nó được khai báo.

Bạn có hai lựa chọn:

OPTION 1:

Tạo một bảng trong đó bạn có thể lưu trữ các hồ sơ vĩnh viễn.

OPTION 2:

select các hồ sơ từ bên trong thủ tục lưu trữ như:

alter procedure ValidateInputXML 
DECLARE @tmpInput MyTableType; 

--Table is populated from an INPUT XML 

SELECT * FROM @tmpInput TI WHERE TI.EntryType = 'Attribute'; 

và sau đó

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