どちらも SQL Server 2012 で記述され、SQL Server Management Studio で実行され、結果を xml として生成する 2 つのストアド プロシージャがあります。
ただし、これら 2 つのプロシージャが Entity Data Model にインポートされ、マッピング先の関数が呼び出されると、ssms から実行された場合と同じ結果が得られるのは 1 つだけです。
これは入力パラメーターの 1 つと関係があるに違いないと思いますが、それらが実際にはそれほど異なっていないことを考えると、なぜこれが起こっているのか途方に暮れています。
2 つのストアド プロシージャを次に示します。SPA は両方の環境から実行された場合に機能し、SPB は ssms で実行された場合に「2015-07-05」のようにパラメーター ダイアログ ボックスに入力された日付値を使用して実行されますが、日付値として追加すると失敗します (日付ドロップダウンから派生) #5/7/2015 12:00:00 AM# のようなパラメーターを生成します。
コードから呼び出されたときに実行を妨げるが、ssms が適切に実行できるようにする、spb の私の側の明らかな偽物を誰かが見つけることができますか。
スパ
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/>
提案を歓迎します。
編集
Devart の Entity Developer for 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 と end の日付は、日付編集コントロールにバインドされた Date 型のプロパティです。
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
開始日と終了日は日付型のプロパティです。