Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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递归标量函数的性能?_Sql_Sql Server_User Defined Functions - Fatal编程技术网

如何提高sql递归标量函数的性能?

如何提高sql递归标量函数的性能?,sql,sql-server,user-defined-functions,Sql,Sql Server,User Defined Functions,我已经创建了一个SQL递归标量函数,它可以生成一个JSON,它可以运行1600条记录,并在30秒内生成一个JSON。我想减少这个时间,我该怎么做?请输入下面的代码 ALTER FUNCTION [dbo].[function_Json_by_shumail](@POSITIONID INT, @IsRoot INT ) RETURNS VARCHAR(MAX) BEGIN DECLARE @Json VARCHAR(MAX) = '{}', @Name NVARCHAR(MAX)

我已经创建了一个SQL递归标量函数,它可以生成一个JSON,它可以运行1600条记录,并在30秒内生成一个JSON。我想减少这个时间,我该怎么做?请输入下面的代码

ALTER  FUNCTION [dbo].[function_Json_by_shumail](@POSITIONID INT, @IsRoot INT ) 
RETURNS VARCHAR(MAX)

BEGIN 
    DECLARE @Json VARCHAR(MAX) = '{}', @Name NVARCHAR(MAX), @Title NVARCHAR(MAX), @Phone NVARCHAR(MAX), @Company NVARCHAR(MAX), @Email NVARCHAR(MAX) , @Children    NVARCHAR(MAX)

    SET @Json =  
    (SELECT P.Name as name , ISNULL(P.POSTIONTITTLE,'') as title, ISNULL(P.primarycontactemail,'') as email , ISNULL(P.PRIMARYCONTACTPHONE,'') as phone , ISNULL(P.[COMPANY NAME],'') as company ,JSON_QUERY(dbo.function_Json_by_shumail(P.POSITIONID, 2) ) AS children 
    FROM [dbo].[VW_WorkerHierarchyUpdated] AS P  
    WHERE P.PARENTPOSITIONID = @POSITIONID
    FOR JSON AUTO);

    IF(@IsRoot = 0) 
    BEGIN
       SELECT @Name = P.Name FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
       SELECT @Title = ISNULL(P.POSTIONTITTLE,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
       SELECT @Phone = ISNULL(P.PRIMARYCONTACTPHONE,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
       SELECT @Company = ISNULL(P.[COMPANY NAME],'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
       SELECT @Email = ISNULL(P.primarycontactemail,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.PARENTPOSITIONID is Null
       SET @Json =   '{"name":"' + @Name + '","title":"' + @Title + '","email":"' + @Email + '","phone":"' + @Phone + '","company":"' + @Company + '","children":' + CAST(@Json AS VARCHAR(MAX)) + '}'
       SET @IsRoot = 1
    END
    IF(@IsRoot = @POSITIONID) 
    BEGIN
       SELECT @Name = P.Name FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
       SELECT @Title = ISNULL(P.POSTIONTITTLE,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
       SELECT @Phone = ISNULL(P.PRIMARYCONTACTPHONE,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
       SELECT @Company = ISNULL(P.[COMPANY NAME],'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
       SELECT @Email = ISNULL(P.primarycontactemail,'') FROM [dbo].[VW_WorkerHierarchyUpdated] AS P WHERE P.POSITIONID = @POSITIONID
       SET @Json =   '{"name":"' + @Name + '","title":"' + @Title + '","email":"' + @Email + '","phone":"' + @Phone + '","company":"' + @Company + '","children":' + CAST(@Json AS VARCHAR(MAX)) + '}'
       SET @IsRoot = 1
    END


    RETURN @Json 

END

样本数据最好作为+。请将您的问题包括在内,包括您当前的尝试和期望的结果。不使用标量自定义项可能是一个开始;大家都知道他们的表现很差。你到底想用什么来实现这个功能?为什么它有这么多子查询(它引用了
VW_workerhierarchy每次迭代更新
5次)。我假设VW_WorkerhierarchyUpdate是一个
视图
;它是嵌套视图吗?样本数据和预期结果将帮助我们帮助您;考虑到您似乎在构建JSON,为什么不直接使用JSON的
?@Larnu我正在尝试实现组织层次结构,我已经将5个
select
语句转换为一个但仍然相同的结果。是
VW_WorkerHierarchyUpdated
是嵌套的
视图。但是
VIEW
单独运行只需1秒我明白了你的意思。可以通过了解需求并编写VW_WorkerHierarchyUpdate的优化脚本来解决。忘记
VIEW单独运行只需1秒
。问题是View+UDF+Recursive无法解决它。所以最好修复层次结构脚本,然后决定它是放在View中还是放在UDF中。