我想了解具体记录。所以我的查询将如下所示......
SELECT
ID,
NAME,
(SELECT...) AS UserCount // Stmt1
FROM MyTable
问题在于,'Stmt1'是一个复杂的语句,不能写为内部查询。 好吧,我可以使用函数,但该语句包含'CREATE TABLE',因此我收到以下错误消息
Cannot access temporary tables from within a function.
完成任务的最佳方法是什么?
答案 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/
其他替代方案将是..