sqlserver2005 表值函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver2005 表值函数相关的知识,希望对你有一定的参考价值。

sqlserver2005 表值函数中能不能用if语句?如果能用,怎么使用if语句?

下面的语句,报错:
Create FUNCTION fun_getBaseClacViewF
(
@mYear int,
@mMonth int
)
RETURNS TABLE
AS
RETURN
(
if 1=@mMonth
begin
select t2.mTmPayType as 上月付款方式,t1.*
from
(select * from v_monthRpt where mYear=@mYear and mMonth=@mMonth) as t1
left join
(select * from v_monthRpt where mYear=@mYear and mMonth=@mMonth-1) as t2
on t1.cNO=t2.cNO
end
else
begin
select t2.mTmPayType as 上月付款方式,t1.*
from
(select * from v_monthRpt where mYear=@mYear and mMonth=@mMonth) as t1
left join
(select * from v_monthRpt where mYear=@mYear-1 and mMonth=12) as t2
on t1.cNO=t2.cNO
end
)
GO

报表信息:
消息 156,级别 15,状态 1,过程 fun_getBaseClacViewF,第 20 行
关键字 'if' 附近有语法错误。
消息 102,级别 15,状态 1,过程 fun_getBaseClacViewF,第 38 行
')' 附近有语法错误。

参考技术A if后的条件要有()的

存储过程 xyz 或表值函数的使用频率 - SQL Server 2008 R2

【中文标题】存储过程 xyz 或表值函数的使用频率 - SQL Server 2008 R2【英文标题】:How often is Stored Procedure xyz, or Table Valued Function Used – SQL Server 2008 R2 【发布时间】:2011-01-28 10:16:07 【问题描述】:

我们有许多视图、存储过程、表值和标量函数。

我们如何才能看到它们在 SQL Server 中被调用的频率甚至多少次?

我们是否需要编辑每一个以在每次调用时更新一个表以获得此信息,或者 SQL Server 是否将此信息保存在某处?

【问题讨论】:

另见dba.stackexchange.com/questions/16493/… 【参考方案1】:

这是 Glenn Berry 的 DMV 查询之一。它计算缓存存储过程执行了多少次(由当前数据库过滤):

SELECT TOP(25) p.name AS [SP Name], qs.execution_count,
ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) AS [Calls/Second],
qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.total_worker_time AS [TotalWorkerTime],  
qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time],
qs.cached_time
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.execution_count DESC OPTION (RECOMPILE);

注意:SQL Server 仅保留上次服务重启后的信息,并且在内存压力下也可能丢弃信息。

还请注意,仅执行计数并不能说明全部情况。识别成本最高的查询并改进它们通常会更好。我通常从最高的逻辑读取开始(这是 Glenn 的另一个):

SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads], 
qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count, 
ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) AS [Calls/Second], 
qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count 
AS [avg_elapsed_time], qs.cached_time
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE);

[另外,请注意:您可能有定期安排的流程(例如每月一次)。因此,并非 100% 可以识别出使用这些调用的存储过程。]

【讨论】:

哇,谢谢,这正是我所需要的。这与性能无关(尽管这很有趣),它是为了让我知道我们可以删除哪些,因为它们没有被使用。谢谢。

以上是关于sqlserver2005 表值函数的主要内容,如果未能解决你的问题,请参考以下文章

sql2005中 表值函数是啥

SQL之用户自定义函数

SQL之用户自定义函数

关于sqlserve2000和sqlserver2005以后版本配置连接池的一些思路

通过在 SQL Server 2000 中传递变量参数来加入表值函数

如何部署SQLServer2005