2013-11-20 14 views
24

Tôi có một quy trình được lưu giữ lấy tham số đầu vào @CategoryKeys varchar và phân tích nội dung của nó thành bảng tạm thời, #CategoryKeys.Cách chuyển bảng tạm thời thành tham số thành một thủ tục được lưu riêng biệt

 -- create the needed temp table. 
     CREATE TABLE #CategoryKeys 
      (
      CategoryKey SMALLINT 
     ); 

     -- fill the temp table if necessary 
     IF Len(rtrim(ltrim(@CategoryKeys))) > 0 
      BEGIN 
       INSERT INTO #CategoryKeys 
          (CategoryKey) 
       SELECT value 
       FROM dbo.String_To_SmallInt_Table(@CategoryKeys, ','); 
      END 

Nếu bảng tạm thời có hàng, tôi muốn chuyển bảng vào một quy trình được lưu trữ riêng. Làm thế nào tôi sẽ đi về việc tạo một tham số trong thủ tục riêng biệt để giữ bảng tạm thời?

+0

Thay vì đi qua một danh sách bằng dấu phẩy ở nơi đầu tiên, bạn có nghĩ về việc sử dụng [thông số bảng giá trị] (http://technet.microsoft.com /en-us/library/bb510489.aspx)? Bạn cũng đã đọc [bài viết này] (http://www.sommarskog.se/share_data.html) chưa? –

+0

Hoặc XML, vì SQL Server cung cấp hỗ trợ cho kiểu dữ liệu XML ... –

Trả lời

11

Khi bạn tạo một bảng #TEMP, các "phạm vi" lớn hơn chỉ là thủ tục nó được tạo ra trong

Dưới đây là một mẫu:.

IF EXISTS 
    (
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspProc002' 
    ) 
BEGIN 
    DROP PROCEDURE [dbo].[uspProc002] 
END 


GO 

CREATE Procedure dbo.uspProc002 
AS 

BEGIN 

    /* Note, I did not Create #TableOne in this procedure. It "pre-existed". An if check will ensure that it is there. */ 
    IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL 
    begin 
     Insert into #TableOne (SurrogateKey , NameOf) select 2001, 'uspProc002' 
    end 

END 


GO 



IF EXISTS 
    (
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspProc001' 
    ) 
BEGIN 
    DROP PROCEDURE [dbo].[uspProc001] 
END 


GO 

CREATE Procedure dbo.uspProc001 (
@Param1 int 
) 
AS 

BEGIN 


    IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL 
    begin 
      drop table #TableOne 
    end 


    CREATE TABLE #TableOne 
    ( 
    SurrogateKey int , 
    NameOf varchar(12) 
    ) 

    Insert into #TableOne (SurrogateKey , NameOf) select 1001, 'uspProc001' 

    Select * from #TableOne 

    EXEC dbo.uspProc002 

    Select * from #TableOne 

    IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL 
    begin 
      drop table #TableOne 
    end 


END 


GO 




exec dbo.uspProc001 0 

có nói rằng, XIN LÀM KHÔNG MÃ HÃY NHẬN ĐƯỢC NÀY. ITS TÍNH NĂNG SQL CỦA BIẾN ĐỔI TOÀN CẦU VÀ KHÓ KHĂN MẠNH VÀ XÂY DỰNG.

16

Mặc dù phạm vi tìm hiểu địa chỉ nhu cầu trực tiếp, nghĩ rằng có thể hữu ích khi thêm một vài tùy chọn vào danh sách kết hợp để xây dựng dựa trên các đề xuất từ ​​nhận xét.

  1. đèo XML vào thủ tục lưu trữ
  2. Vượt qua một tham số bảng giá trị vào thủ tục lưu trữ

1. đèo XML vào thủ tục lưu trữ

Với XML thông qua thành một tham số, bạn có thể sử dụng XML trực tiếp trong các truy vấn SQL của bạn và tham gia/áp dụng cho các bảng khác:

CREATE PROC sp_PassXml 
    @Xml XML 
AS 
BEGIN 
    SET NOCOUNT ON 
    SELECT T.Node.value('.', 'int') AS [Key] 
    FROM @Xml.nodes('/keys/key') T (Node) 
END 
GO 

Sau đó, một cuộc gọi đến thủ tục lưu trữ để thử nghiệm:

DECLARE @Text XML = '<keys><key>1</key><key>2</key></keys>' 
EXEC sp_PassXml @Text 

Mẫu đầu ra của một truy vấn đơn giản.

Key 
----------- 
1 
2 

2. đèo một tham số bảng giá trị vào thủ tục lưu trữ

Trước tiên, bạn phải xác định người sử dụng định nghĩa kiểu cho biến bảng được sử dụng bởi các thủ tục lưu trữ.

CREATE TYPE KeyTable AS TABLE ([Key] INT) 

Sau đó, bạn có thể sử dụng loại đó như là một tham số cho proc lưu trữ (các READONLY là cần thiết vì chỉ có IN được hỗ trợ và bảng không thể thay đổi)

CREATE PROC sp_PassTable 
    @Keys KeyTable READONLY 
AS 
BEGIN 
    SET NOCOUNT ON 
    SELECT * FROM @Keys 
END 
GO 

Các proc lưu trữ có thể sau đó được gọi với một biến bảng trực tiếp từ SQL.

DECLARE @Keys KeyTable 
INSERT @Keys VALUES (1), (2) 
EXEC sp_PassTable @Keys 

Lưu ý: Nếu bạn đang sử dụng .NET, thì bạn có thể chuyển tham số SQL từ kiểu DataTable khớp với loại do người dùng xác định.

đầu ra mẫu từ truy vấn:

Key 
----------- 
1 
2 
+0

Trong khi tôi có câu trả lời được chấp nhận cho câu hỏi, tôi sẽ bỏ qua điều này vì "chỉ vì phạm vi hoạt động" ..... không có nghĩa là giải pháp tốt. Việc xử lý #tempTables như biến toàn cục là thực hành thường xuyên không tốt. Và tôi làm chính xác điều này, tôi vượt qua xml tất cả thời gian để thúc đẩy các hoạt động dựa trên thiết lập để tránh các con trỏ và RBAR. – granadaCoder

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