3
我在我的數據庫中存儲了名爲「GetListingId」的過程。它需要三個字符串輸入參數:City
,State
,PhoneNumber
;一個輸入長參數:CallId
並返回一個輸出長參數:ListingId
。用NHibernate執行存儲過程
我想在代碼執行它:
IQuery query = this.appListingRepository.Session.CreateSQLQuery("exec GetListingId @City=:city, @State=:state, @PhoneNumber=:phoneNumber, @CallId=:callId")
.SetString("city", "SAN JOSE")
.SetString("state", "CA")
.SetString("phoneNumber", "+14084801753")
.SetInt64("callId", 1);
long id = query.UniqueResult<long>();
但這扔exeption:Invalid column name 'ListingId'
在SQL Server梟雄Studio的存儲過程執行的罰款。
存儲過程的代碼:
USE [Clickmob_ReportingDb_test]
GO
/****** Object: StoredProcedure [dbo].[GetListingId] Script Date: 11/24/2012 10:46:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--CREATE PROCEDURE GetListingId
ALTER PROCEDURE [dbo].[GetListingId]
(
@City varchar(255),
@State varchar(255),
@PhoneNumber varchar(255),
@CallId bigint
)
AS
BEGIN
DECLARE @TotalPrice float;
DECLARE @TotalCount float;
DECLARE @DestNumber varchar(255);
DECLARE @IsCustD int;
DECLARE @Result bigint;
-- Check Duplicated Calls for Listings --------------------------------------------------------------------------
IF EXISTS (SELECT t.name
FROM tempdb.sys.tables t
WHERE t.name = '##tmp_acc')
DROP TABLE ##tmp_acc;
SELECT Li.AppListingId, Li.ListingInfoId INTO ##tmp_acc
FROM CALLS c, USERDATAS ud, LISTINGINFOS Li
WHERE c.ReportingUserDataId = ud.UserDataId
AND Li.CallId = c.CallId
AND c.DateTime > DateAdd(mm,-3,getdate())
AND Li.DestinationPhoneNumber = (SELECT TOP 1 ud.PhoneNumber
FROM CALLS c, USERDATAS ud
WHERE c.ReportingUserDataId = ud.UserDataId
AND c.CallId = @CallId);
SELECT @IsCustD = COUNT(*) FROM ##tmp_acc;
-----------------------------------------------------------------------------------------------------------------
-- Check Quota Limits -------------------------------------------------------------------------------------------
IF EXISTS (SELECT t.name
FROM tempdb.sys.tables t
WHERE t.name = '##tmp_quots')
DROP TABLE ##tmp_quots;
SELECT L.ListingId INTO ##tmp_quots
FROM (SELECT L.ListingId, L.MonthlyQuotaLimit, L.MonthlyBudget, L.DailyQuotaLimit, L.DailyBudget,
L.SortingPrice, L.Status, acl.CityId
FROM AppLISTINGS L, AppCityToListing acL
WHERE L.ListingId=acL.ListingId) AS L
LEFT JOIN
(SELECT m.CityId, m.CampaignId, m.AppSubCategoryId, m.AppListingId, m.MonthlyCallEarning, m.MonthlyCallCount,
ISNULL(d.DailyCallEarning, 0) AS DailyCallEarning, ISNULL(d.DailyCallCount, 0) AS DailyCallCount
FROM (SELECT c.CityId, c.CampaignId, Li.AppSubCategoryId, Li.AppListingId,
SUM(Li.CallEarning) AS MonthlyCallEarning, COUNT(c.CallId) AS MonthlyCallCount
FROM CALLS c, LISTINGINFOS Li
WHERE Li.CallId=c.CallId
AND Li.CallStatus=1
AND YEAR(c.DateTime)=YEAR(getdate())
AND MONTH(c.DateTime)=MONTH(getdate())
GROUP BY c.CityId, c.CampaignId, Li.AppSubCategoryId, Li.AppListingId) AS m
LEFT JOIN
(SELECT c.CityId, c.CampaignId, Li.AppSubCategoryId, Li.AppListingId,
SUM(Li.CallEarning) AS DailyCallEarning, COUNT(c.CallId) AS DailyCallCount
FROM CALLS c, LISTINGINFOS Li
WHERE Li.CallId=c.CallId
AND Li.CallStatus=1
AND YEAR(c.DateTime)=YEAR(getdate())
AND MONTH(c.DateTime)=MONTH(getdate())
AND DAY(c.DateTime)=DAY(getdate())
GROUP BY c.CityId, c.CampaignId, Li.AppSubCategoryId, Li.AppListingId) AS d
ON (m.CityId=d.CityId AND m.CampaignId=d.CampaignId AND m.AppSubCategoryId=d.AppSubCategoryId AND m.AppListingId=d.AppListingId)) AS s
ON (L.ListingId=s.AppListingId AND L.CityId=s.CityId)
WHERE L.MonthlyQuotaLimit<=s.MonthlyCallCount
OR L.MonthlyBudget<=s.MonthlyCallEarning
OR L.DailyQuotaLimit<=s.DailyCallCount
OR L.DailyBudget<=s.DailyCallEarning;
-----------------------------------------------------------------------------------------------------------------
-- Accessible Listings ------------------------------------------------------------------------------------------
IF EXISTS (SELECT t.name
FROM tempdb.sys.tables t
WHERE t.name = '##tmp_tbl')
DROP TABLE ##tmp_tbl;
SELECT DISTINCT SL.ListingId INTO ##tmp_tbl
FROM (SELECT act.CityId
FROM AppCities act, AppStates ast
WHERE act.StateId=ast.StateId
AND UPPER(act.Name)=UPPER(@City)
AND UPPER(ast.Name)=UPPER(@State)) AS SC,
(SELECT aL.ListingId, aLm.MediaId AS ListingMediaId, abm.BrandId, abm.MediaId AS BrandMediaId,
acm.CustomerId, acm.MediaId AS CustomerMediaId, ascL.SubCategoryId, acL.CityId
FROM AppLISTINGS aL, AppCityToListing acL, AppListingToMedia aLm, AppBRANDS ab, AppBrandToMedia abm,
AppCustomerToMedia acm, AppSubCategoryToListing ascL
WHERE aL.ListingId=aLm.ListingId
AND aL.ListingId=acL.ListingId
AND aL.BrandId=ab.BrandId
AND ab.BrandId=abm.BrandId
AND ab.CustomerId=acm.CustomerId
AND aL.ListingId=ascL.ListingId) AS SL,
(SELECT m.Number, m.CampaignId, m.MediaId, m.SubCategoryId,
ISNULL(abc.BrandId, 0) AS ExceptBrandId,
ISNULL(aLc.ListingId, 0) AS ExceptListingId,
ISNULL(acc.CustomerId, 0) AS ExceptCustomerId
FROM (SELECT ap.Number, ac.CampaignId, ach.MediaId, ascc.SubCategoryId
FROM AppPHONENUMBERS ap, AppCAMPAIGNS ac, AppCHANNELS ach, AppSubCategoryToCampaign ascc
WHERE ap.CampaignId=ac.CampaignId
AND ac.ChannelId=ach.ChannelId
AND ap.CampaignId=ascc.CampaignId) AS m
LEFT JOIN AppBrandToCampaign abc
ON (m.CampaignId=abc.CampaignId)
LEFT JOIN AppListingToCampaign aLc
ON (m.CampaignId=aLc.CampaignId)
LEFT JOIN AppCustomerToCampaign acc
ON (m.CampaignId=acc.CampaignId)
WHERE [email protected]) AS SM
WHERE SC.CityId=SL.CityId
AND SL.SubCategoryId=SM.SubCategoryId
AND (SL.ListingMediaId=SM.MediaId
OR SL.BrandMediaId=SM.MediaId
OR SL.CustomerMediaId=SM.MediaId)
AND SL.ListingId <>SM.ExceptListingId
AND SL.BrandId <>SM.ExceptBrandId
AND SL.CustomerId<>SM.ExceptCustomerId
AND SL.ListingId NOT IN (SELECT AppListingId
FROM ##tmp_acc)
AND SL.ListingId NOT IN (SELECT ListingId
FROM ##tmp_quots);
SELECT @Result = COUNT(*) FROM ##tmp_tbl;
-----------------------------------------------------------------------------------------------------------------
IF @Result > 0
BEGIN
SET @IsCustD = 0;
SELECT @TotalPrice = SUM(sel.Price)
FROM (SELECT aL.ListingId, CASE aL.SortingPrice WHEN 0 THEN aL.LeadPrice
ELSE aL.SortingPrice END AS Price
FROM AppListings aL) AS sel, ##tmp_tbl t
WHERE sel.ListingId=t.ListingId;
SELECT @TotalCount = SUM(aL.CallCount)
FROM AppListings aL, ##tmp_tbl t
WHERE aL.ListingId=t.ListingId;
SELECT @Result = (SELECT TOP 1 ISNULL(sel.ListingId, 0) AS ListingId
FROM (SELECT L.ListingId, (L.Price/@TotalPrice - L.CallCount/(@TotalCount+1)) AS Rate
FROM (SELECT aL.ListingId, aL.CallCount, CASE aL.SortingPrice WHEN 0 THEN aL.LeadPrice
ELSE aL.SortingPrice END AS Price
FROM AppListings aL) AS L) AS sel, ##tmp_tbl t
WHERE sel.ListingId=t.ListingId
ORDER BY sel.Rate DESC);
END
ELSE
BEGIN
IF @IsCustD > 0
BEGIN
SET @IsCustD = 1;
SELECT @TotalPrice = SUM(sel.Price)
FROM (SELECT aL.ListingId, CASE aL.SortingPrice WHEN 0 THEN aL.LeadPrice
ELSE aL.SortingPrice END AS Price
FROM AppListings aL) AS sel, ##tmp_acc t
WHERE sel.ListingId=t.ListingId;
SELECT @TotalCount = SUM(aL.CallCount)
FROM AppListings aL, ##tmp_acc t
WHERE aL.ListingId=t.ListingId;
SELECT @Result = (SELECT TOP 1 ISNULL(sel.ListingId, 0) AS ListingId
FROM (SELECT L.ListingId, (L.Price/@TotalPrice - L.CallCount/(@TotalCount+1)) AS Rate
FROM (SELECT aL.ListingId, aL.CallCount, CASE aL.SortingPrice WHEN 0 THEN aL.LeadPrice
ELSE aL.SortingPrice END AS Price
FROM AppListings aL) AS L) AS sel, ##tmp_acc t
WHERE sel.ListingId=t.ListingId
ORDER BY sel.Rate DESC);
END
ELSE
RETURN 0;
END;
UPDATE AppLISTINGS
SET CallCount=CallCount+1
WHERE [email protected];
SELECT @DestNumber = (SELECT TOP 1 ISNULL(n.Number, '') AS Number
FROM AppPHONENUMBERS n
WHERE [email protected]
ORDER BY n.PhoneNumberId);
INSERT INTO LISTINGINFOS (CallStatus, IsCustomerDuplicate, DestinationPhoneNumber, CallId, AppListingId)
VALUES (5, @IsCustD, @DestNumber, @CallId, @Result);
RETURN @Result;
END
你能分享存儲過程的代碼嗎? – Suhas