UFN_DISCOUNTRESULTS_COMPUTEHASH
Return
Return Type |
---|
varbinary |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SALESORDERID | uniqueidentifier | IN | |
@ITEMDISCOUNTS | UDT_APPLYDISCOUNTS_SALESORDERAVAILABLEDISCOUNT | IN | |
@DISCOUNTORDERITEMSXML | xml | IN |
Definition
Copy
CREATE function dbo.UFN_DISCOUNTRESULTS_COMPUTEHASH
(
@SALESORDERID uniqueidentifier,
@ITEMDISCOUNTS UDT_APPLYDISCOUNTS_SALESORDERAVAILABLEDISCOUNT readonly,
@DISCOUNTORDERITEMSXML xml -- In my tests, parsing the already-created XML was faster than re-selecting from the tables (for single iterations)
)
returns varbinary(20)
with execute as caller
as begin
-- Notes:
-- -- datetime -> nvarchar conversion format 120 is 'yyyy-mm-dd hh:mm:ss'
-- -- IMPORTANT: Including 'DATECHANGED' in the hash ensures that we won't return obsolete results if any prices or criteria change that could affect the calculations.
declare @SCENARIOSTRINGTOHASH nvarchar(max) = '';
select @SCENARIOSTRINGTOHASH = @SCENARIOSTRINGTOHASH
+ convert(nchar(36), DISCOUNT.ID)
+ convert(nchar(19), DISCOUNT.DATECHANGED, 120)
+ case when LIMITOVERRIDE.ID is not null then '#' + cast(LIMITOVERRIDE.NUMBEROFDISCOUNTSPERORDER as nvarchar(10)) + '#' else '' end
from @ITEMDISCOUNTS ITEMDISCOUNTS
inner join dbo.DISCOUNT on DISCOUNT.ID = ITEMDISCOUNTS.DISCOUNTID
left join dbo.SALESORDERDISCOUNTLIMITOVERRIDE LIMITOVERRIDE on (LIMITOVERRIDE.SALESORDERID = @SALESORDERID and LIMITOVERRIDE.DISCOUNTID = DISCOUNT.ID)
order by DISCOUNT.ID;
select @SCENARIOSTRINGTOHASH = @SCENARIOSTRINGTOHASH
+ convert(nchar(36), TICKETITEMS.PROGRAMID)
+ coalesce(convert(nchar(36), TICKETITEMS.EVENTID), '')
+ convert(nchar(36), TICKETITEMS.PRICETYPECODEID)
+ TICKETITEMS.QUANTITYSTR
+ TICKETITEMS.UNITPRICESTR
+ convert(nchar(19), coalesce(PROGRAMEVENTPRICE.DATECHANGED, PROGRAMPRICE.DATECHANGED), 120)
from (
select
T.c.value('(@PROGRAMID)[1]','uniqueidentifier') PROGRAMID,
T.c.value('(@EVENTID)[1]','uniqueidentifier') EVENTID,
T.c.value('(@PRICETYPECODEID)[1]','uniqueidentifier') PRICETYPECODEID,
T.c.value('(@QUANTITY)[1]','nvarchar(20)') QUANTITYSTR,
T.c.value('(@UNITPRICE)[1]','nvarchar(20)') UNITPRICESTR
from
@DISCOUNTORDERITEMSXML.nodes('/DISCOUNTORDERITEMSXML/ITEM') T(c)
) TICKETITEMS
left join dbo.PROGRAMPRICE on PROGRAMPRICE.PROGRAMID = TICKETITEMS.PROGRAMID and PROGRAMPRICE.PRICETYPECODEID = TICKETITEMS.PRICETYPECODEID
left join dbo.PROGRAMEVENTPRICE on PROGRAMEVENTPRICE.EVENTID = TICKETITEMS.EVENTID and PROGRAMEVENTPRICE.PRICETYPECODEID = TICKETITEMS.PRICETYPECODEID
where TICKETITEMS.PROGRAMID is not null
order by TICKETITEMS.PROGRAMID, TICKETITEMS.EVENTID, TICKETITEMS.PRICETYPECODEID;
select @SCENARIOSTRINGTOHASH = @SCENARIOSTRINGTOHASH
+ convert(nchar(36), MERCHITEMS.MERCHANDISEPRODUCTINSTANCEID)
+ MERCHITEMS.QUANTITYSTR
+ MERCHITEMS.UNITPRICESTR
+ convert(nchar(19), MERCHANDISEPRODUCTINSTANCE.DATECHANGED, 120)
from (
select
T.c.value('(@MERCHANDISEPRODUCTINSTANCEID)[1]','uniqueidentifier') MERCHANDISEPRODUCTINSTANCEID,
T.c.value('(@QUANTITY)[1]','nvarchar(20)') QUANTITYSTR,
T.c.value('(@UNITPRICE)[1]','nvarchar(20)') UNITPRICESTR
from
@DISCOUNTORDERITEMSXML.nodes('/DISCOUNTORDERITEMSXML/ITEM') T(c)
) MERCHITEMS
inner join dbo.MERCHANDISEPRODUCTINSTANCE on MERCHANDISEPRODUCTINSTANCE.ID = MERCHITEMS.MERCHANDISEPRODUCTINSTANCEID
where MERCHITEMS.MERCHANDISEPRODUCTINSTANCEID is not null
order by MERCHITEMS.MERCHANDISEPRODUCTINSTANCEID;
if (len(@SCENARIOSTRINGTOHASH) <= 4000) --Allowed input values are limited to 8000 bytes(i.e. 4000 characters) for HASHBYTES method
begin
return hashbytes('SHA1', @SCENARIOSTRINGTOHASH);
end
return null;
end