Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 对表中的不同值调用函数_Tsql_Sql Server 2005 - Fatal编程技术网

Tsql 对表中的不同值调用函数

Tsql 对表中的不同值调用函数,tsql,sql-server-2005,Tsql,Sql Server 2005,我有一个SQLServer2005数据库。除了对这些不同的值调用函数之外,我还需要获得不同的值。当涉及函数调用时,我不确定distinct是如何工作的。例如,我有以下查询: SELECT DISTINCT a, b, c, fcn_DoSomething(a, b, c) AS z FROM users 我猜函数(fcn_DoSomething)是为表中的所有值调用的,而不是为不同的值调用的。我说得对吗?如果是这样,我如何编写查询以仅对a、b、c的不同值调用函数?我知道一个选择是使用临时桌子,

我有一个SQLServer2005数据库。除了对这些不同的值调用函数之外,我还需要获得不同的值。当涉及函数调用时,我不确定distinct是如何工作的。例如,我有以下查询:

SELECT DISTINCT a, b, c, fcn_DoSomething(a, b, c) AS z FROM users
我猜函数(fcn_DoSomething)是为表中的所有值调用的,而不是为不同的值调用的。我说得对吗?如果是这样,我如何编写查询以仅对a、b、c的不同值调用函数?我知道一个选择是使用临时桌子,但如果有人有更好的想法,那就太好了


谢谢

这将确保只对不同的值调用函数

select *, fcn_DoSomething(a, b, c) 
from
 (select distinct a,b,c FROM users) v

但是,我相信函数调用将得到优化,因此可能不会有什么不同。试试看。

这让我好奇,所以我做了一些基本测试。我创建了一个小表,其中包含一些不同的和重复的值,这是一个只进行字符串连接的函数,然后查看了以下各项的执行计划:

Go
DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 


select distinct cola, colb, dbo.sillyfunc(cola, colb)
from distincttest

--Clear the cache
Go
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE 

select cola, colb, dbo.sillyfunc(cola, colb)
from (select distinct cola, colb from distincttest) as t
在本例中,执行计划清楚地显示,第一个计划为每一行运行连接函数,但第二个计划首先对不同的值进行排序,然后运行该函数。但对于少数行,它们的执行时间相同,当一起运行时,它们显示每个行使用了总查询资源的50%

因此,我添加了几十万个重复行。然后再试一次。这改变了查询计划,因此它正在进行哈希匹配以获得明确性,而不是以前的排序,现在第二个版本强制它选择明确性,第一个版本的执行速度要快十倍以上

最后,我认为这可能是因为SQL Server将我的sillyfunc标记为不确定(
select OBJECTPROPERTYEX(object_id('dbo.sillyfunc'),'isdeterministic')
返回了0),所以我切换到了一个内置函数并认为是确定的。这给了我相同的结果,第一个版本中的每一行都调用了函数,而第二个版本中的每一行都调用了函数

因此,进一步的测试可能会发现一些情况,这些情况会诱使优化器做一些更复杂的事情,但是如果您想在调用函数之前应用distinct,那么您需要使用类似子查询、CTE或temp表的东西来限制函数的访问权限