2012-11-24 64 views
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 
+0

你能分享存儲過程的代碼嗎? – Suhas

回答

2

改變你的存儲過程來SELECT @Result沒有返回它或使用ADO.NET如圖Rohit's answer to this question

我用過的另一種方法是創建一個存儲proc(GetListintId_return)的包裝器,用於選擇GetListingId的結果。