3

У меня есть две хранимые процедуры, написанные на SQL Server 2012, и оба исполняемые в SQL Server Management Studio, которые производят их результаты как xml.Сохраненные процедуры возвращают результаты при выполнении в SSMS, но только один выполняется при выполнении кода

Однако, когда эти две процедуры импортируются в модель данных сущности, а затем функции, к которым они привязаны, называются только одним, то получаются те же результаты, что и при выполнении из ssms.

Я думаю, что это должно иметь какое-то отношение к одному из входных параметров, но при условии, что они на самом деле не такие разные. Я не понимаю, почему это происходит.

Две хранимые процедуры показаны ниже. SPA работает, когда выполняется из обеих сред, SPB запускается при выполнении в ssms с значениями даты, введенными в диалоговом окне параметров, например «2015-07-05», но сбой при добавлении в качестве значения даты (полученное из даты вниз control), который создает такой параметр, как это # ​​5/7/2015 12:00:00 AM #.

Может ли кто-нибудь обнаружить некоторые очевидные faux pas с моей стороны в spb, которые предотвратили бы его выполнение при вызове из кода, но все равно позволяющие ssms выполнить его правильно.

SPA

Create PROCEDURE [dbo].[CreateErsSalesAddSubmissionXmlByDateRange] 
    @uname VARCHAR(10) , 
    @pword VARCHAR(10) , 
    @sntype VARCHAR(1) , 
    @action VARCHAR(10) , 
    @salesContractRef VARCHAR(10), 
    @auctionId NCHAR(10) , 
    @startDate DATE, 
    @endDate DATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    SELECT 
    RTRIM(@uname) AS '@uname', 
    RTRIM(@pword) AS '@pword', 
    (SELECT 
     @snType AS '@snType', 
     RTRIM(@action) AS '@action', 
     COALESCE(@salesContractRef, '') AS '@salesContractRef', 
     CONVERT(VARCHAR(10), DateOfPurchase, 112) AS '@saleDate', 
     RTRIM(COALESCE(@auctionID, '')) AS '@auctionID', 
     ISNULL(Logbook1 + ',', '') + ISNULL(Logbook2 + ',', '') + ISNULL(Logbook3 + ',', '') AS '@logBookNums', 
     ISNULL(LandingDecNumber1 + ',', '') + ISNULL(LandingDecNumber2 + ',', '') + ISNULL(LandingDecNumber3 + ',', '') AS '@landingDecNums', 
     COALESCE(VesselName, '') AS '@vesselName', 
     RTRIM(VesselPLN) AS '@vesselPln', 
     RTRIM(VesselOwner) AS '@vesselMasterOwner', 
     COALESCE(CONVERT(VARCHAR(10), LandingDate1, 112), '') AS '@landingDate1', 
     COALESCE(CONVERT(VARCHAR(10), LandingDate2, 112), '') AS '@landingDate2', 
     COALESCE(CONVERT(VARCHAR(10), LandingDate3, 112), '') AS '@landingDate3', 
     RTRIM(CountryOfLanding) AS '@countryOfLanding', 
     RTRIM(PortOfLanding) AS '@landingPortCode', 
     RTRIM(lh1.LandingId) AS '@internalRef', 
     (SELECT 
      COALESCE(RTRIM(SpeciesCode),'') AS '@speciesCode', 
      RTRIM(FishingArea) AS '@faoAreaCode', 
      COALESCE(RTRIM(IcesZone),'') AS '@ZoneCode', 
      COALESCE(RTRIM(ld.DisposalCode),'') AS '@disposalCode', 
      COALESCE(ld.FreshnessGrade,'') AS '@freshnessCode', 
      COALESCE(ld.ProductSize,'') AS '@sizeCode', 
      COALESCE(ld.PresentationCode,'') AS '@presentationCode', 
      COALESCE(ld.PresentationState,'') AS '@stateCode', 
      RTRIM(ld.NumberOfFish) AS '@numberOfFish', 
      FORMAT(ld.Quantity, 'N2') AS '@weightKgs', 
      FORMAT(Quantity * ld.UnitPrice, 'N2') AS '@value', 
      COALESCE(ld.Currency,'') AS '@currencyCode', 
      RTRIM(ld.WithdrawnDestinationCode) AS '@withdrawnDestinationCode', 
      RTRIM(ld.BuyersRegistrationCode) AS '@buyerReg', 
      RTRIM(ld.SalesContractRef) AS '@salesContractRef' 

     FROM LandingDetails ld 
     JOIN LandingHeaders lh 
      ON ld.LandingId = lh.LandingId 
     WHERE ld.LandingId = lh1.LandingId 
     FOR XML PATH ('salesline'), TYPE) 

    FROM 
     LandingHeaders lh1 
    WHERE 
     lh1.AllocatedErsId IS NULL 
     AND lh1.LandingDate1 BETWEEN @startDate AND @endDate 
    ORDER BY 
     VesselName, lh1.LandingId 
    FOR XML PATH ('salesnote'), TYPE) 
FOR XML PATH ('ers') 
END 
GO 

SPB

CREATE PROCEDURE [dbo].[GetLandingsToBePurchasedByDateAndPln] 
     @startDate DATE , 
     @endDate DATE , 
     @VesselPln nchar(10) 
AS 
BEGIN 
    --SET LANGUAGE 'British English'; 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT 
     (SELECT 
      ContactId AS '@ContactId', 
      VesselOwner AS '@Owner', 
      FORMAT(Owed, 'N2') AS '@Owed', 
      FORMAT(WeeklyDeductionRate, 'C') AS '@WeeklyDeductionRate', 
      FORMAT(FromMinimumReturn, 'C') AS '@FromMinimumReturn', 
      FORMAT(DeductionRate, 'P') AS '@DeductionRate', 
      FORMAT(TotalDeductions, 'N2') AS '@TotalDeductions', 
      FORMAT(TempReturn, 'N2') AS '@TempReturn', 
      FORMAT(InternalCommission, 'P') AS '@InternalCommissionRate', 
      FORMAT(InternalDeduction, 'P') AS '@InternalDeductionRate', 
      FORMAT(InternalCommissionAmount, 'N2') AS '@InternalCommissionAmount', 
      FORMAT(InternalDeductionAmount, 'N2') AS '@InternalDeductionAmount', 
      FORMAT(TotalToBeReturned, 'N2') AS '@TotalToBeReturned', 
      (SELECT DISTINCT 
        ld1.ProductId AS '@ProductId', 
        FORMAT(AVG(ld1.UnitPrice), 'N2') AS '@Cost', 
        FORMAT(SUM(ld1.Quantity), 'N2') AS '@Quantity' 
       FROM 
        LandingDetails ld1 
       INNER JOIN 
        dbo.LandingHeaders lh1 ON ld1.LandingId = lh1.LandingId 
       WHERE 
        Posted = 0 
        AND lh1.VesselOwner = a.VesselOwner 
       GROUP BY 
        ld1.ProductId 
       FOR XML PATH ('Products'), TYPE) 
    FROM (SELECT 
    Contacts.ContactId AS ContactId, 
    LandingHeaders.VesselOwner AS VesselOwner, 
    SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) AS Owed, 
    SocietyMemberships.WeeklyDeductionRate AS WeeklyDeductionRate, 
    SocietyMemberships.FromMinimumReturn AS FromMinimumReturn, 
    Deductions.DeductionRate, 
    Vessels.InternalCommission, 
    Vessels.InternalDeduction, 
    CASE 
     WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
     ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
    END AS TotalDeductions, 


    --need to add some logic here I presume that utiles the sql below that is being used to calculate the total to be returned 


    SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - 
    (CASE 
     WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
     ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
    END) AS TempReturn, 



    (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - 
    (CASE 
     WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
     ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
    END)) * InternalCommission AS InternalCommissionAmount, 

    (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - 
    (CASE 
     WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
     ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
    END)) * InternalDeduction AS InternalDeductionAmount, 


    CASE 
     WHEN (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - 
     (CASE 
      WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
      ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
     END)) * InternalCommission > 0 THEN (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - 
     (CASE 
      WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
      ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
     END)) + ((SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - 
     (CASE 
      WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
      ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
     END)) * InternalCommission) 

     ELSE (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - 
     (CASE 
      WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
      ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
     END)) + ((SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - 
     (CASE 
      WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate 
      ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
     END)) * InternalDeduction) 
    END AS TotalToBeReturned 





    FROM dbo.LandingDetails 
    INNER JOIN dbo.LandingHeaders 
    ON LandingDetails.LandingId = LandingHeaders.LandingId 
    INNER JOIN dbo.Vessels 
    ON LandingHeaders.VesselId = Vessels.VesselId 
    INNER JOIN dbo.Contacts 
    ON Vessels.OwnerId = Contacts.ContactId 
    INNER JOIN dbo.SocietyMemberships 
    ON Contacts.SocietyId = SocietyMemberships.SocietyId 
    INNER JOIN dbo.Deductions 
    ON Vessels.DeductionId = Deductions.DeductionId 
    WHERE (LandingHeaders.Posted = 0) 
    AND (LandingDate1 BETWEEN @startDate AND @endDate) 
    AND LandingHeaders.VesselPLN = RTRIM(@VesselPln) 
    GROUP BY ContactId, 
      LandingHeaders.VesselOwner, 
      SocietyMemberships.WeeklyDeductionRate, 
      SocietyMemberships.FromMinimumReturn, 
      Deductions.DeductionRate, 
      Vessels.InternalCommission, 
      Vessels.InternalDeduction) a 
    ORDER BY ContactId 

    FOR XML PATH ('Owner'), TYPE) 

FOR XML PATH ('PurchaseOrders') 
END 

GO 

При выполнении из SSMS, SPB производит следующее:

<PurchaseOrders> 
    <Owner ContactId="39" Owner="M Mouse" Owed="1,609.39" 
     WeeklyDeductionRate="$10.00" FromMinimumReturn="$110.00" 
     DeductionRate="1.50 %" TotalDeductions="34.14" 
     TempReturn="1,575.24" InternalCommissionRate="0.00 %" 
     InternalDeductionRate="0.00 %" InternalCommissionAmount="0.00" 
     InternalDeductionAmount="0.00" TotalToBeReturned="1,575.24"> 
    <Products ProductId="33" Cost="5.00" Quantity="0.40" /> 
    <Products ProductId="34" Cost="1.80" Quantity="0.90" /> 
    <Products ProductId="41" Cost="2.30" Quantity="1.30" /> 
    <Products ProductId="42" Cost="2.25" Quantity="1.30" /> 
    <Products ProductId="43" Cost="1.60" Quantity="10.50" /> 
    <Products ProductId="57" Cost="7.00" Quantity="13.30" /> 
    <Products ProductId="59" Cost="9.63" Quantity="47.00" /> 
    <Products ProductId="61" Cost="6.23" Quantity="32.60" /> 
    <Products ProductId="66" Cost="1.00" Quantity="5.60" /> 
    <Products ProductId="92" Cost="0.50" Quantity="4.80" /> 
    <Products ProductId="125" Cost="1.00" Quantity="3.80" /> 
    <Products ProductId="139" Cost="6.50" Quantity="3.90" /> 
    <Products ProductId="156" Cost="1.50" Quantity="1.70" /> 
    <Products ProductId="161" Cost="5.80" Quantity="44.20" /> 
    <Products ProductId="171" Cost="3.88" Quantity="12.00" /> 
    <Products ProductId="173" Cost="4.55" Quantity="32.50" /> 
    <Products ProductId="175" Cost="5.00" Quantity="52.90" /> 
    <Products ProductId="182" Cost="0.50" Quantity="18.50" /> 
    <Products ProductId="198" Cost="0.50" Quantity="27.40" /> 
    <Products ProductId="220" Cost="1.50" Quantity="38.60" /> 
    <Products ProductId="231" Cost="6.00" Quantity="0.90" /> 
    <Products ProductId="236" Cost="0.85" Quantity="2.10" /> 
    </Owner> 
</PurchaseOrders> 

При выполнении из моего приложения с помощью функции, созданной я В модели она производит следующее;

<PurchaseOrders/> 

Я бы приветствовал любые предложения.

EDIT

Вот код, как созданный DevArt в Entity Developer для SPA

Public Overridable Function CreateErsSalesAddSubmissionXmlByDateRange (ByVal uname As String, ByVal pword As String, ByVal sntype As String, ByVal action As String, ByVal salesContractRef As String, ByVal auctionId As String, ByVal startDate As Global.System.Nullable(Of System.DateTime), ByVal endDate As Global.System.Nullable(Of System.DateTime)) As ObjectResult(Of CreateErsSalesAddSubmissionXmlByDateRangeResult) 
      Dim unameParameter As ObjectParameter 
      If (Not uname Is Nothing) Then 
       unameParameter = New ObjectParameter("uname", uname) 
      Else 
       unameParameter = New ObjectParameter("uname", GetType(String)) 
      End If 
      Dim pwordParameter As ObjectParameter 
      If (Not pword Is Nothing) Then 
       pwordParameter = New ObjectParameter("pword", pword) 
      Else 
       pwordParameter = New ObjectParameter("pword", GetType(String)) 
      End If 
      Dim sntypeParameter As ObjectParameter 
      If (Not sntype Is Nothing) Then 
       sntypeParameter = New ObjectParameter("sntype", sntype) 
      Else 
       sntypeParameter = New ObjectParameter("sntype", GetType(String)) 
      End If 
      Dim actionParameter As ObjectParameter 
      If (Not action Is Nothing) Then 
       actionParameter = New ObjectParameter("action", action) 
      Else 
       actionParameter = New ObjectParameter("action", GetType(String)) 
      End If 
      Dim salesContractRefParameter As ObjectParameter 
      If (Not salesContractRef Is Nothing) Then 
       salesContractRefParameter = New ObjectParameter("salesContractRef", salesContractRef) 
      Else 
       salesContractRefParameter = New ObjectParameter("salesContractRef", GetType(String)) 
      End If 
      Dim auctionIdParameter As ObjectParameter 
      If (Not auctionId Is Nothing) Then 
       auctionIdParameter = New ObjectParameter("auctionId", auctionId) 
      Else 
       auctionIdParameter = New ObjectParameter("auctionId", GetType(String)) 
      End If 
      Dim startDateParameter As ObjectParameter 
      If (startDate.HasValue) Then 
       startDateParameter = New ObjectParameter("startDate", startDate) 
      Else 
       startDateParameter = New ObjectParameter("startDate", GetType(Global.System.Nullable(Of System.DateTime))) 
      End If 
      Dim endDateParameter As ObjectParameter 
      If (endDate.HasValue) Then 
       endDateParameter = New ObjectParameter("endDate", endDate) 
      Else 
       endDateParameter = New ObjectParameter("endDate", GetType(Global.System.Nullable(Of System.DateTime))) 
      End If 
      Return DirectCast(Me, IObjectContextAdapter).ObjectContext.ExecuteFunction(Of CreateErsSalesAddSubmissionXmlByDateRangeResult)("FishTrackerProfessionalEntities.CreateErsSalesAddSubmissionXmlByDateRange", unameParameter, pwordParameter, sntypeParameter, actionParameter, salesContractRefParameter, auctionIdParameter, startDateParameter, endDateParameter) 
     End Function 

и называется в моем коде следующим образом:

Using ftpe = New FishTrackerProfessionalEntities 
     Try 
      Dim result = ftpe.CreateErsSalesAddSubmissionXmlByDateRange("uname", "pword", "B", "INSERT", String.Empty, String.Empty, ErsStartDate, ErsEndDate) 
      xmlValue = String.Join(String.Empty, result.Select(Function(r) r.XMLF52E2B6118A111d1B10500805F49916B)) 
     Catch Ex As Exception 

ErsStart и конечные даты свойства типа Дата привязана к дате редактирования.

Для Spb мы имеем:

Public Overridable Function GetLandingsToBePurchasedByDateAndPln (ByVal startDate As Global.System.Nullable(Of System.DateTime), ByVal endDate As Global.System.Nullable(Of System.DateTime), ByVal VesselPln As String) As ObjectResult(Of CreateErsSalesAddSubmissionXmlByDateRangeResult) 
     Dim startDateParameter As ObjectParameter 
     If (startDate.HasValue) Then 
      startDateParameter = New ObjectParameter("startDate", startDate) 
     Else 
      startDateParameter = New ObjectParameter("startDate", GetType(Global.System.Nullable(Of System.DateTime))) 
     End If 
     Dim endDateParameter As ObjectParameter 
     If (endDate.HasValue) Then 
      endDateParameter = New ObjectParameter("endDate", endDate) 
     Else 
      endDateParameter = New ObjectParameter("endDate", GetType(Global.System.Nullable(Of System.DateTime))) 
     End If 
     Dim VesselPlnParameter As ObjectParameter 
     If (Not VesselPln Is Nothing) Then 
      VesselPlnParameter = New ObjectParameter("VesselPln", VesselPln) 
     Else 
      VesselPlnParameter = New ObjectParameter("VesselPln", GetType(String)) 
     End If 
     Return DirectCast(Me, IObjectContextAdapter).ObjectContext.ExecuteFunction(Of CreateErsSalesAddSubmissionXmlByDateRangeResult)("FishTrackerProfessionalEntities.GetLandingsToBePurchasedByDateAndPln", startDateParameter, endDateParameter, VesselPlnParameter) 
    End Function 

И это называется, как так;

Using ftpe = New FishTrackerProfessionalEntities 
     Try 
      Dim result = ftpe.GetLandingsToBePurchasedByDateAndPln(StartDate, EndDate, VesselPln) 
      xmlValue = String.Join(String.Empty, result.Select(Function(r) r.XMLF52E2B6118A111d1B10500805F49916B)) 
     Catch Ex As Exception 

с датой начала и окончания, являющейся свойствами типа даты.

+1

Это, скорее всего, проблема с параметром параметра '@ VesselPln' или тем, как вы его передаете. – RBarryYoung

+0

@RBarryYoung В обоих случаях (ssms и из кода он передается как жало. В случае результатов, которые я поставил в вопросе, строка была «RX89». Основным типом данных VesselPln является Nchar (10) –

+0

Вы должны показать нам код вызова для обоих случаев. То есть, покажите нам, как вы вызываете SPB как в коде, так и в SSMS. – RBarryYoung

ответ

0

Это, скорее всего, проблема заключается в параметры, и в моем опыте, даты всегда бардак ..

Наиболее распространенной проблемой является месяц-день обращения, это происходит на различных сценариях, например, неявной конверсия между датой и датой.
посмотрите на это:

declare @d1 date = '2016-02-03' 
declare @d2 datetime = '2016-02-03' 
select FORMAT(@d1, 'yyyy-MMMM-dd') ParDate, FORMAT(@d2, 'yyyy-MMMM-dd') ParDateTime 

результат смешно:

ParDate    ParDateTime 
2016-febbraio-03 2016-marzo-02 

Таким образом, вы можете попробовать отлаживать SPB, изменить положение о PATH ('Owner')WHERE в СПБ.
Temporarly рем оба условия на @startDate/@endDate и @VesselPln

-- AND (LandingDate1 BETWEEN @startDate AND @endDate) 
-- AND LandingHeaders.VesselPLN = RTRIM(@VesselPln) 

Затем попытайтесь вызвать его из приложения, он должен вернуть все результаты.
Затем повторно добавьте условие на @VesselPln, протестируйте его, я думаю, он все равно выдаст что-то.

Если нет, вы уже нашли свою проблему, может быть, что-то связанное с многобайтными строками nchar(10) или менее вероятно, что-то связанное с проходами ansi и заканчивающимися пробелами.

Если да, то добавьте @startDate и @endDate в SELECT разделе PATH ('Owner'), чтобы проверить, как они рассматриваются в SPB:

FORMAT(@startDate, 'yyyy-MMMM-dd') as '@StartDate', 
FORMAT(@endDate, 'yyyy-MMMM-dd') as '@EndDate', 

Таким образом, вы должны увидеть в вашем выводе XML, что это проблема.

Надеюсь, это поможет.