我想要获取特定记录的数量。因此,我的查询将如下所示...
SELECT
ID,
NAME,
(SELECT...) AS UserCount // Stmt1
FROM MyTable
问题在于'Stmt1'是一个复杂的语句,无法写成内部查询。
虽然我可以使用函数,但该语句包括'CREATE TABLE',所以我会收到以下错误消息:“无法从函数中访问临时表。” 最佳的完成任务的方法是什么?
我想要获取特定记录的数量。因此,我的查询将如下所示...
SELECT
ID,
NAME,
(SELECT...) AS UserCount // Stmt1
FROM MyTable
问题在于'Stmt1'是一个复杂的语句,无法写成内部查询。
虽然我可以使用函数,但该语句包括'CREATE TABLE',所以我会收到以下错误消息:您可以使用用户定义的表类型来解决您的问题。
您只需创建一个类似于以下示例的表变量:
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/
其他的替代方案包括:
COUNT
、SUM
或AVG
与OVER
子句和(通常)PARTITION BY
组合。MyTable
中的值有关。因此,必须有一种方法将MyTable
连接到生成UserCount
的任何表格上。SELECT id
, name
, user_count = COUNT(*) OVER()
FROM MyUsers