2012-03-05 27 views
11

Tôi muốn nhận được số lượng hồ sơ cụ thể. Vì vậy, truy vấn của tôi sẽ trông giống như sau ...Không thể truy cập các bảng tạm thời từ bên trong một hàm

SELECT 
    ID, 
    NAME, 
    (SELECT...) AS UserCount // Stmt1 
FROM MyTable 

Vấn đề là, 'Stmt1' là một câu lệnh phức tạp và không thể viết dưới dạng truy vấn bên trong. Vâng, tôi có thể sử dụng chức năng này, nhưng báo cáo kết quả bao gồm 'CREATE TABLE' vì vậy tôi nhận được thông báo lỗi sau

Cannot access temporary tables from within a function.

cách tốt nhất để hoàn thành nhiệm vụ là gì?

Trả lời

18

Bạn có thể sử dụng loại bảng do người dùng xác định để giải quyết vấn đề của mình.

Bạn chỉ cần tạo một biến bảng như

CREATE TYPE [dbo].[yourTypeName] AS TABLE(
    [columeName1] [int] NULL, 
    [columeName2] [varchar](500) NULL, 
    [columeName3] [varchar](1000) NULL 
) 
GO 

và bạn có thể khai báo biến bảng này trong chức năng của bạn như

CREATE FUNCTION [dbo].[yourFunctionName] 
( 
    @fnVariable1 INT , 
    @yourTypeNameVariable yourTypeName READONLY 
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 

    SELECT ................. 
     FROM @yourTypeNameVariable 
     WHERE ........ 
    RETURN @r 
END 

Mở thủ tục của bạn, bạn có thể khai báo loại bảng của bạn như

DECLARE @yourTypeNamevaribale AS yourTypeName 

Và bạn có thể chèn các giá trị vào bảng này như

insert into @yourTypeNamevaribale (col,col,..)values(val,val,..) 

pass này để chức năng của bạn như

dbo.yourFunctionName(fnVariable1 ,@yourTypeNamevaribale) 

xin vui lòng đi cho phương pháp này, cảm ơn bạn

2

Có, bạn không thể sử dụng bảng #temp.

Vì bạn đang sử dụng SQL Server 2008, tại sao bạn không sử dụng biến bảng thay vì #temp tables? Hãy dùng thử.

+0

Đồng ý sử dụng @TempTable Declare như TABLE ( elementid int, yếu tố VARCHAR (8000) ) thay vì #table –

1

Tôi đã xem qua bài viết này khi tôi bắt đầu sử dụng các biến bảng và chuyển sang bảng tạm thời vì lý do hiệu suất chỉ để tìm các bảng tạm thời không thể được sử dụng trong một hàm.

Tôi sẽ do dự về việc sử dụng các biến bảng đặc biệt nếu bạn đang chơi với tập hợp kết quả lớn, vì chúng được giữ trong bộ nhớ. Xem bài đăng này ...

http://totogamboa.com/2010/12/03/speed-matters-subquery-vs-table-variable-vs-temporary-table/

lựa chọn thay thế khác sẽ là ..

  1. Extracting kết quả bảng tạm thời vào một chức năng bảng.
  2. Chuyển đổi mã vào sử dụng truy vấn con
+0

Biến bảng không được lưu trữ "chỉ trong bộ nhớ": http://sqlserverplanet.com/tsql/yet-another-temp-tables-vs-table-variables-article –

0

Trong 99,99% các trường hợp có được không cần bất kỳ thủ đoạn với các bảng tạm thời hoặc truy vấn con, nhưng việc sử dụng kết hợp các chức năng như COUNT, SUM hoặc AVG kết hợp với OVER clause và (thường) PARTITION BY.

Tôi không chắc chắn những gì OP đã cố gắng đạt được nhưng tôi giả định rằng UserCount bằng cách nào đó liên quan đến các giá trị trong MyTable. Vì vậy, phải có cách để tham gia MyTable với bất kỳ bảng nào tạo ra UserCount.

Ví dụ đơn giản nhất là để hiển thị tất cả người dùng và tổng số lượng người dùng

SELECT id 
    , name 
    , user_count = COUNT(*) OVER() 
FROM MyUsers 
Các vấn đề liên quan