2017-05-19 8 views
0

Ich habe die folgende SQL Server gespeicherte Prozedur:Gespeicherte Prozedur friert Funktion aufrufen

ALTER PROCEDURE [dbo].[stg_GetFileDetails] 
    @file_name AS NVARCHAR(255), 
    @remove_dots AS BIT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF (@remove_dots = 1) 
    BEGIN 
     SELECT 
      o.r_object_id, 
      '' AS [DAP ID], 
      p.nhs_patientid AS [MRN], 
      p.nhs_firstname AS [First Name], 
      p.nhs_surname AS [Surname], 
      o.object_name AS [File Name] 
     FROM  
      dm_sysobject_s o 
     INNER JOIN 
      nhs_instance_audit_s a ON o.r_object_id = a.r_object_id 
     INNER JOIN 
      nhs_patient_document_s d ON d.r_object_id = a.dia_edms_document_id 
     INNER JOIN 
      nhs_patient_s p ON d.nhs_patdoc_patientid = p.nhs_patientid 
     WHERE 
      [dbo].[No_dots_filename](o.object_name) = @file_name 
    END 
    ELSE 
    BEGIN 
     SELECT 
      o.r_object_id, 
      '' AS [DAP ID], 
      p.nhs_patientid AS [MRN], 
      p.nhs_firstname AS [First Name], 
      p.nhs_surname AS [Surname], 
      o.object_name AS [File Name] 
     FROM  
      dm_sysobject_s o 
     INNER JOIN 
      nhs_instance_audit_s a ON o.r_object_id = a.r_object_id 
     INNER JOIN 
      nhs_patient_document_s d ON d.r_object_id = a.dia_edms_document_id 
     INNER JOIN 
      nhs_patient_s p ON d.nhs_patdoc_patientid = p.nhs_patientid  
     WHERE 
      o.object_name = @file_name 
    END 

Nun ist diese funktioniert gut, wenn @remove_dots falsch ist, aber wenn es wahr ist, es die folgende Funktion aufruft:

ALTER FUNCTION [dbo].[No_dots_filename] 
    (@file_name AS NVARCHAR(255)) 
RETURNS NVARCHAR(255) 
AS 
BEGIN 
    DECLARE @revised_filename AS NVARCHAR(255) 
    DECLARE @ext AS NVARCHAR(5) 

    IF (LEN(@file_name) > 4) 
    BEGIN 
     -- see if the extension is a traditional 3 character one 
     IF SUBSTRING(@file_name, LEN(@file_name) - 4, 1) = '.' 
     BEGIN 
      SET @ext = RIGHT(@file_name, 4) 
     END 
     ELSE   -- otherwise it might be one of the 4 character extensions like .docx 
     BEGIN 
      SET @ext = RIGHT(@file_name, 5) 
     END 

     -- remove dots from the main filename and then replace the extension 
     SET @revised_filename = REPLACE(LEFT(@file_name, LEN(@file_name) - LEN(@ext)), '.', '') + @ext 
    END 
    ELSE 
    BEGIN 
     SET @revised_filename = @file_name 
    END 

    RETURN @revised_filename 
END 

Die gespeicherte Prozedur friert ein oder dauert mindestens so lange, dass es keinen Unterschied macht.

Irgendwelche Vorschläge, wie man das besser codiert?

Antwort

0

Es gibt mehrere Ressourcen in Bezug auf die Vermeidung einer Funktion auf der linken Seite Ihrer WHERE Bedingung, genau weil es sehr schlechte Leistung verursacht. Ihre Funktion wird für jede einzelne Zeile in der gesamten Ergebnismenge ausgeführt, was Ihr Problem verursacht. Eine dieser Ressourcen ist Common SQL Server Mistakes – Functions in the WHERE Clause.

Eine Möglichkeit, dies zu vermeiden, wäre die Umwandlung Ihrer Funktion in eine table-valued Eins und Kreuz Anwendung damit.

Verwandte Themen