我想获得特定记录的计数。因此,我的查询将如下所示。。。
SELECT
ID,
NAME,
(SELECT...) AS UserCount // Stmt1
FROM MyTable
问题是,"Stmt1"是一个复杂的语句,不能写成innerquery。好吧,我可以使用函数,但语句中包含"CREATE TABLE",所以我得到以下错误消息
Cannot access temporary tables from within a function.
完成任务的最佳方式是什么?
您可以使用用户定义的表类型来解决您的问题。
您只需创建一个类似的表变量
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 )
请采用这种方法,谢谢
是的,您不能使用#temp表。
既然您使用的是SQL Server 2008,为什么不使用表变量而不是#temp表呢?试试看。
我看到这篇文章时,我开始使用表变量,出于性能原因切换到临时表,结果发现临时表不能在函数中使用。
我会犹豫是否使用表变量,尤其是如果你正在处理大型结果集,因为这些结果集保存在内存中。查看此帖子。。。
http://totogamboa.com/2010/12/03/speed-matters-subquery-vs-table-variable-vs-temporary-table/
其他选择是。
- 将临时表结果提取到另一个表函数中
- 将代码转换为使用子查询
在99,99%的情况下,不需要任何临时表或子查询技巧,而是将COUNT
、SUM
或AVG
等聚合函数与OVER
子句和(通常)PARTITION BY
结合使用。
我不确定OP试图实现什么,但我认为UserCount在某种程度上与MyTable
中的值有关。因此,必须有一种方法将MyTable
连接到生成UserCount
的任何表。
最简单的例子是显示所有用户和用户总数
SELECT id
, name
, user_count = COUNT(*) OVER()
FROM MyUsers