Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Sql server 在存储过程中使用时,SQL Server中出现标量函数请求超时问题_Sql Server_Tsql_Stored Functions - Fatal编程技术网

Sql server 在存储过程中使用时,SQL Server中出现标量函数请求超时问题

Sql server 在存储过程中使用时,SQL Server中出现标量函数请求超时问题,sql-server,tsql,stored-functions,Sql Server,Tsql,Stored Functions,这是撒拉函数。我在具有多个参数的存储过程中使用它。对于小的结果来说是好的,但是对于大数据来说,它会超时,并且需要很长的执行时间。请分享一些其他替代或一些增强功能 ALTER FUNCTION [dbo].[FNGETMULIPLEASSIGNESS_NEW2] ( @TIMELINEID INT, @MILSTONEID INT, @TASKID INT ) RETURNS varchar(max) AS BEGIN DECLARE @Assignees var

这是撒拉函数。我在具有多个参数的存储过程中使用它。对于小的结果来说是好的,但是对于大数据来说,它会超时,并且需要很长的执行时间。请分享一些其他替代或一些增强功能

ALTER FUNCTION [dbo].[FNGETMULIPLEASSIGNESS_NEW2]
(
  @TIMELINEID INT,
  @MILSTONEID INT,
  @TASKID INT
)

RETURNS varchar(max)
AS
  BEGIN
        DECLARE @Assignees varchar(max)='', @isExists bit=0
   if(@TASKID=0)
        BEGIN
        Select  @Assignees = @Assignees+ FIRSTNAME +' ' + LASTNAME+', '  
            FROM CASETIMELINEPEOPLE 
            INNER JOIN USERDETAIL  ON 
            CASETIMELINEPEOPLE.PEOPLEUSERID=USERDETAIL.USERID
            WHERE (CASETIMELINEID= @TIMELINEID) AND 
            (TEMPLATEMILESTONEID=@MILSTONEID) AND 
            (TEMPLATETASKID is null) and CASETIMELINEPEOPLE.isdeleted=0
    END

  else

        BEGIN
            Select  @Assignees = @Assignees+ FIRSTNAME +' ' + LASTNAME+','  
            FROM CASETIMELINEPEOPLE 
            INNER JOIN USERDETAIL  ON 
            CASETIMELINEPEOPLE.PEOPLEUSERID=USERDETAIL.USERID
            WHERE (CASETIMELINEID= @TIMELINEID) AND 
            (TEMPLATEMILESTONEID=@MILSTONEID) AND 
            (TEMPLATETASKID=@TASKID) and CASETIMELINEPEOPLE.isdeleted=0

       END

        SELECT @Assignees=SUBSTRING(@Assignees, 0,LEN(@Assignees))  
        RETURN @Assignees
END

使用内联表值函数将提高性能

参考:


以下是标量函数的内联表值函数版本,它使用:

rextester演示:

测试设置:

create table casetimelinepeople (
    casetimelineid int
  , peopleuserid int
  , templatemilestoneid int
  , templatetaskid int
  , isdeleted bit not null default 0
);
insert into casetimelinepeople values
 (1,1,1,null,0)
,(1,2,1,null,0)
,(1,3,1,null,0)
,(1,2,1,1,0)
,(1,3,1,1,0)

create table userdetail (
    userid int not null
  , firstname varchar(32) not null
  , lastname varchar(32) not null);
insert into userdetail values
 (1, 'Some', 'One')
,(2, 'Avinash', 'Raikwar')
,(3, 'Sql','Zim');
go
查询内联表值函数,如下所示:

select * 
from dbo.fn_get_multiple_assigness_itvf(1,1,0) 
返回

+----------------------------------+
|            Assignees             |
+----------------------------------+
| Some One,Avinash Raikwar,Sql Zim |
+----------------------------------+

返回:

+-------------------------+
|        Assignees        |
+-------------------------+
| Avinash Raikwar,Sql Zim |
+-------------------------+

用于为查询中的每一行调用函数:

select *
from casetimelinepeople ctp
  cross apply dbo.fn_get_multiple_assigness_itvf(
      ctp.casetimelineid
    , ctp.templatemilestoneid
    , ctp.templatetaskid
    ) x
返回:

+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
| casetimelineid | peopleuserid | templatemilestoneid | templatetaskid | isdeleted |            Assignees             |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
|              1 |            1 |                   1 | NULL           | False     | Some One,Avinash Raikwar,Sql Zim |
|              1 |            2 |                   1 | NULL           | False     | Some One,Avinash Raikwar,Sql Zim |
|              1 |            3 |                   1 | NULL           | False     | Some One,Avinash Raikwar,Sql Zim |
|              1 |            2 |                   1 | 1              | False     | Avinash Raikwar,Sql Zim          |
|              1 |            3 |                   1 | 1              | False     | Avinash Raikwar,Sql Zim          |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+

我认为没有太多的替代方案来改进选择。也许通过引用字段向表中添加一些索引会有所帮助。通过
WHERE COALESCE(TEMPLATETASKID,0)=@TASKID
(或者只是一个普通的或处于条件中的)可以避免if/else。索引缺失,罗布·法利的文章非常优秀。谢谢你发布。@AlanBurstein很高兴你喜欢它!
select *
from casetimelinepeople ctp
  cross apply dbo.fn_get_multiple_assigness_itvf(
      ctp.casetimelineid
    , ctp.templatemilestoneid
    , ctp.templatetaskid
    ) x
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
| casetimelineid | peopleuserid | templatemilestoneid | templatetaskid | isdeleted |            Assignees             |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
|              1 |            1 |                   1 | NULL           | False     | Some One,Avinash Raikwar,Sql Zim |
|              1 |            2 |                   1 | NULL           | False     | Some One,Avinash Raikwar,Sql Zim |
|              1 |            3 |                   1 | NULL           | False     | Some One,Avinash Raikwar,Sql Zim |
|              1 |            2 |                   1 | 1              | False     | Avinash Raikwar,Sql Zim          |
|              1 |            3 |                   1 | 1              | False     | Avinash Raikwar,Sql Zim          |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+