需要帮助使我的存储过程更有效

时间:2017-05-25 14:51:45

标签: sql-server stored-procedures

我想帮助我提高SQL Server 2016存储过程的效率。我得到了它的工作,这是我的50%的战斗,但我知道你们中的许多人(如果不是大多数)对SQL Server存储过程的经验比我更多。

到目前为止我的代码:

DECLARE @U1A nvarchar(50), @U2A nvarchar(50),
        @U3A nvarchar(50), @U4A nvarchar(50),
        @U5A nvarchar(50), @U6A nvarchar(50),
        @U7A nvarchar(50), @U8A nvarchar(50),
        @U9A nvarchar(50)

DECLARE @Jsonstring  nvarchar(max)
DECLARE @recCount int

SELECT 
    @recCount = COUNT(*) 
FROM 
    [dbo].[Staging_PersonalInformation] 
WHERE 
    jsondata IS NULL

WHILE @recCount > 0
BEGIN
    SELECT TOP 1 
        @U1A = [FirstName], @U2A = [MiddleName], 
        @U3A = [LastName], @U4A = [EmailAddress],
        @U5A = eraCommons, @U6A = [PositionTitle],
        @U7A = [MyNCBILink], @U8A = [UniqueID],
        @U9A = [ReferenceID]
    FROM 
        [dbo].[Staging_PersonalInformation]
    WHERE 
        jsondata IS NULL

    SET @Jsonstring = '[{"name":"FirstName","value":"'+isnull(@U1A, '')+'"},{"name":"Middlename","value":"'+ISNULL(@U2A, '')+'"},{"name":"LastName","value":"'+isnull(@U3A, '')+'"},{"name":"emailaddress","value":"'+isnull(@U4A, '')+'"},{"name":"eRACommons","value":"'+ISNULL(@U5A, '')+'"},{"name":"positionTitle","value":"'+ISNULL(@U6A, '')+'"},{"name":"MyNCBILink","value":"'+ISNULL(@U7A, '')+'"},{"name":"  uniqueid","value":"'+ISNULL(@U8A, '')+'"},{"name":"ReferenceID","value":"'+ISNULL(@U9A, '')+'"}]'

    UPDATE Staging_PersonalInformation
    SET JsonData = @Jsonstring
    WHERE (EmailAddress = @U4A);

    SET @recCount = @recCount - 1
END

这样做的目的是获取单个列值并创建一个我的已消毒JavaScript表单可以重新填充的字符串。我希望存储字符串,而不是每次都在运行它。

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

最大的问题是循环效率非常低。由于您总是要根据表中已有的值更新此列,因此您可以使用计算列并完全避免所有这些工作。

我建议将来你给你的变量名称一些有意义的东西,而不仅仅是编号。

以下是如何将其设为计算列的方法。您可以在此处阅读有关计算列的更多信息https://technet.microsoft.com/en-us/library/ms191250.aspx

alter table [dbo].[Staging_PersonalInformation]
add jsondata as '[{"name":"FirstName","value":"' + isnull(FirstName, '')
    + '"},{"name":"Middlename","value":"' + ISNULL(MiddleName, '')
    + '"},{"name":"LastName","value":"' + isnull(LastName, '')
    + '"},{"name":"emailaddress","value":"'+isnull(EmailAddress, '')
    + '"},{"name":"eRACommons","value":"'+ISNULL(eraCommons, '')
    + '"},{"name":"positionTitle","value":"'+ISNULL(PositionTitle, '')
    + '"},{"name":"MyNCBILink","value":"'+ISNULL(MyNCBILink, '')
    + '"},{"name":"  uniqueid","value":"'+ISNULL(UniqueID, '')
    + '"},{"name":"ReferenceID","value":"'+ISNULL(ReferenceID, '')
    + '"}]'

答案 1 :(得分:0)

Sean Lange的回答是一个很好的答案,但我很好奇为什么你没有利用for json的SQL Server 2016支持。

我意识到格式与你指定的格式不一样,所以我想这可能就是原因。也许这种格式也可以使用?:

select * 
from Staging_PersonalInformation 
for json auto, include_null_values

dbfiddle.uk演示:http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=d533c6d3b82fdd7865b3817fba94037d

返回:

[{"Id":1,"FirstName":"Sean","MiddleName":null,"LastName":"Lange","EmailAddress":null,"PositionTitle":null,"MyNCBILink":null,"UniqueID":"6E6732A9-9FC9-4B6E-8695-AF6BB2DA2152","ReferenceID":0}
,{"Id":2,"FirstName":"Sql","MiddleName":null,"LastName":"Zim","EmailAddress":null,"PositionTitle":null,"MyNCBILink":null,"UniqueID":"FA33808B-E8BE-41B5-AA89-DA8A37503F8F","ReferenceID":0}]

参考: