无法从函数中访问临时表

时间:2012-03-05 04:26:36

标签: sql-server-2008 function

我想了解具体记录。所以我的查询将如下所示......

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

问题在于,'Stmt1'是一个复杂的语句,不能写为内部查询。 好吧,我可以使用函数,但该语句包含'CREATE TABLE',因此我收到以下错误消息

Cannot access temporary tables from within a function.

完成任务的最佳方法是什么?

3 个答案:

答案 0 :(得分:22)

您可以使用用户定义的表格类型来解决您的问题。

您只需创建一个像

这样的表变量
CREATE TYPE [dbo].[yourTypeName] AS TABLE(
    [columeName1] [int] NULL,
    [columeName2] [varchar](500) NULL,
    [columeName3] [varchar](1000) NULL
)
GO

您可以在函数中声明此表变量,如

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

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

在您的程序中,您可以声明您的表格类型,如

DECLARE @yourTypeNamevaribale AS yourTypeName 

您可以在此表中插入值,如

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

将此传递给您的函数,如

dbo.yourFunctionName(fnVariable1 ,@yourTypeNamevaribale )

请选择此方法,谢谢

答案 1 :(得分:2)

是的,你不能使用#temp table。

在使用SQL Server 2008时,为什么不使用表变量而不是#temp表? 试一试。

答案 2 :(得分:1)

当我开始使用表变量并因性能原因切换到临时表时,我遇到了这篇文章,但却发现临时表无法在函数中使用。

我会对使用表变量犹豫不决,特别是如果你正在玩大型结果集,因为它们保存在内存中。看这篇文章......

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

其他替代方案将是..

  1. 将临时表结果提取到另一个表函数中。
  2. 将代码转换为使用子查询