2013-11-22 25 views
0

我有這個疑問:通過向光標SQL服務器添加順序2005

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[SP_ANSWER_GRID] 
    @league int, 
    @league_survey_id int, 
    @page_size int, 
    @page_num int, 
    @orderby varchar(50), 
    @f_division_id int, 
    @myf_group_id int, 
    @searchname varchar(250) 
AS 
--These will be sproc params: 
--declare @page_size int; 
--declare @page_num int; 
--declare @league_survey_id int; 
--declare @orderby varchar(50); 
--set @league_survey_id = 340; 
--set @page_size=419; 
--set @page_num=0; 
--set @orderby = 'f_member_id'; 
---- 
declare @query varchar(max); 
declare @joins varchar(max); 
declare @groupaddon varchar(max); 
declare @membersearchaddon varchar(max); 
declare @questionid varchar(50); 
declare @question varchar(50); 
declare @question_type int; 
declare @minrow int; 
declare @maxrow int; 
declare @i int; 
if @myf_group_id= 0 
    begin 
     set @groupaddon = '' 
    end 
    else 
     begin 
      set @groupaddon = 'and f_group_id = ' + convert(varchar(50),@myf_group_id) + '' 
     end 
set @minrow = @page_size * @page_num; 
if len(@searchname) = 0 
    begin 
     set @membersearchaddon = '' 
    end 
    else 
     begin 
      set @membersearchaddon = 'and str_last_name like ''' + convert(varchar(250),@searchname) + '%''' 
     end 
set @maxrow = ((@page_num + 1) * @page_size); 
-- one sec 
set @i = 0; 
set @query = 'select * from (select *, ROW_NUMBER() OVER (ORDER BY ' + @orderby + ') as RANK from (select 
    a.f_member_id,a.f_member_id as bulk_f_member_id,a.f_member_id as p_member_id, 
    ( select max(ans.dte_added) 
     from tb_league_survey_answers ans with(nolock)   
        where ans.f_member_id = a.f_member_id 
        and ans.f_league_survey_id = ' + convert(varchar(50),@league_survey_id) + ') dte_added, 

    ( select top 1 ans.f_division_id 
     from tb_league_survey_answers ans with(nolock)   
        where ans.f_member_id = a.f_member_id 
        and ans.f_division_id != 0 
        and ans.f_league_survey_id = ' + convert(varchar(50),@league_survey_id) + ') f_division_id, 

    ( select top 1 dues_collected.int_division_fees_collected 
     from tb_league_dues_collected dues_collected with(nolock) 
      inner join tb_league_dues l_dues with(nolock) on (dues_collected.f_dues_id = l_dues.p_dues_id) 
       where dues_collected.f_league_id = ' + convert(varchar(50),@league) + ' 
       and l_dues.f_league_id = ' + convert(varchar(50),@league) + ' 
       and l_dues.bln_archived = 0 
       and dues_collected.f_division_id = (select top 1 ans.f_division_id from tb_league_survey_answers ans with(nolock) where ans.f_member_id = a.f_member_id and ans.f_league_survey_id = ' + convert(varchar(50),@league_survey_id) + ' and ans.f_division_id !=0) 
       and dues_collected.f_member_id = a.f_member_id 
       order by l_dues.p_dues_id desc 
        ) int_division_fees_collected, 

    ( select top 1 dues_collected.int_amount_collected 
     from tb_league_dues_collected dues_collected with(nolock) 
      inner join tb_league_dues l_dues with(nolock) on (dues_collected.f_dues_id = l_dues.p_dues_id) 
       where dues_collected.f_league_id = ' + convert(varchar(50),@league) + ' 
       and l_dues.bln_archived = 0 
       and l_dues.f_league_id = ' + convert(varchar(50),@league) + ' 
       and dues_collected.f_division_id = (select top 1 ans.f_division_id from tb_league_survey_answers ans with(nolock) where ans.f_member_id = a.f_member_id and ans.f_league_survey_id = ' + convert(varchar(50),@league_survey_id) + ' and ans.f_division_id !=0) 
       and dues_collected.f_member_id = a.f_member_id 
       order by l_dues.p_dues_id desc 
       ) int_amount_collected, 

    ( select top 1 dues_collected.bln_master_transaction 
     from tb_league_dues_collected dues_collected with(nolock) 
      inner join tb_league_dues l_dues with(nolock) on (dues_collected.f_dues_id = l_dues.p_dues_id) 
       where dues_collected.f_league_id = ' + convert(varchar(50),@league) + ' 
       and l_dues.bln_archived = 0 
       and l_dues.f_league_id = ' + convert(varchar(50),@league) + ' 
       and dues_collected.f_division_id = (select top 1 ans.f_division_id from tb_league_survey_answers ans with(nolock) where ans.f_member_id = a.f_member_id and ans.f_league_survey_id = ' + convert(varchar(50),@league_survey_id) + ' and ans.f_division_id !=0) 
       and dues_collected.f_member_id = a.f_member_id 
       order by l_dues.p_dues_id desc 
       ) bln_master_transaction, 

    ( select max(cast(bln_multiple_payments_order as int)) as bln_multiple_payments_order 
      from tb_league_dues_collected with(nolock) 
      where XID in (
         select distinct(XID) as XID 
          from tb_league_dues_collected dues_collected with(nolock) 
          inner join tb_league_dues l_dues with(nolock) on (dues_collected.f_dues_id = l_dues.p_dues_id) 
          where dues_collected.f_league_id = ' + convert(varchar(50),@league) + ' 
          and l_dues.bln_archived = 0 
          and l_dues.f_league_id = ' + convert(varchar(50),@league) + ' 
          and dues_collected.f_division_id = (select top 1 ans.f_division_id from tb_league_survey_answers ans with(nolock) where ans.f_member_id = a.f_member_id and ans.f_league_survey_id = ' + convert(varchar(50),@league_survey_id) + ' and ans.f_division_id !=0) 
          and dues_collected.f_member_id = a.f_member_id 
         ) 
      ) bln_multiple_payments_order, 

a.f_group_id,a.str_group_name,a.str_division,a.str_officer_title,a.p_group_membership_id,a.bln_participation_status,a.str_badge_id,a.master_first_name,a.master_last_name,a.master_email,a.str_phone_number,a.team_creator_id,a.team_admin_list,a.dte_user_birthday,a.str_email_current,a.str_first_name,a.str_middle_name,a.str_last_name,a.f_submember_of' 
set @joins = '' 
declare cur cursor local for 
    (
     select distinct convert(varchar(50), p_league_survey_question_id), str_question, str_question_type 
     from tb_league_survey_questions with(nolock) 
     where f_league_survey_id = @league_survey_id 
    ); 
open cur 
fetch next from cur into @questionid, @question, @question_type 
while (@@fetch_status = 0) 
begin 
set @joins = @joins + ' 
left outer join tb_league_survey_answers q' + convert(varchar(50), @i) + ' with(nolock) on q' + convert(varchar(50), @i) + '.f_league_survey_question_id = ' + @questionid + ' and q' + convert(varchar(50), @i) + '.f_member_id = a.f_member_id' 
if (@question_type <> 4) 
begin 
    set @query = @query + ', q' + convert(varchar(50), @i) + '.str_answer as [question' + @questionid + '] ' 
end else begin 
    set @query = @query + ', qDiv' + convert(varchar(50), @i) + '.str_division as [question' + @questionid + '] ' 
    set @joins = @joins + ' 
left outer join tb_league_team_divisions qDiv' + convert(varchar(50), @i) + ' with(nolock) on qDiv' + convert(varchar(50), @i) + '.p_division_id = convert(int, q' + convert(varchar(50), @i) + '.str_answer)' 
end 
--from tb_league_team_divisions where p_division_id = ' + convert(varchar(50), @divisionid) + ') 
fetch next from cur into @questionid, @question, @question_type 
set @i = @i + 1; 
end 
close cur 
deallocate cur 
set @query = @query + ' from vw_league_members a with(nolock) ' + @joins + ' WHERE exists 
    (
     select * 
     from tb_league_survey_answers ans with(nolock) 
     where ans.f_member_id = a.f_member_id 
     and a.f_league_id = <league_placeholder> 
     and ans.f_league_survey_id = ' + convert(varchar(50),@league_survey_id) + ' 
     and ans.f_division_id = ' + convert(varchar(50),@f_division_id) + '  
     <group_placeholder> 
     <membersearch_placeholder> 
    ) 
) data) dataouter where RANK > ' + convert(varchar(50), @minrow) + ' AND RANK <= ' + convert(varchar(50), @maxrow) 
set @query = replace(@query, '<group_placeholder>', @groupaddon) 
set @query = replace(@query, '<membersearch_placeholder>', @membersearchaddon) 
set @query = replace(@query, '<league_placeholder>', @league) 
--print @query; 
execute(@query); 

我需要做的是增加一個爲了這部分的T-SQL

declare cur cursor local for 
    (
     select distinct convert(varchar(50), p_league_survey_question_id), str_question, str_question_type 
     from tb_league_survey_questions with(nolock) 
     where f_league_survey_id = @league_survey_id 
    ); 

但我得到

消息156,級別15,狀態1,過程SP_ANSWER_GRID,行中的關鍵字 '秩序' 近119
不正確的語法。

我在做什麼錯?

+0

旁註:你應該** **不使用'sp_'前綴爲您的存儲過程。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

感謝您的提示。讚賞。 –

回答

1

刪除括號

declare cur cursor local for 
     select distinct convert(varchar(50), p_league_survey_question_id), str_question, str_question_type 
     from tb_league_survey_questions with(nolock) 
     where f_league_survey_id = @league_survey_id 
     order by 1 
+0

我做了,現在我得到消息145,級別15,狀態1,過程SP_ANSWER_GRID,行115 如果指定了SELECT DISTINCT,則ORDER BY項目必須出現在選擇列表中。 –

+0

@JeffShain是的。如果您使用了不同的列,則按列添加的列必須包含在選擇列表中。 –

+0

如果你仔細想想,這是完美的。您按順序使用的值可能在由distinct關鍵字合併到單個行的行之間有所不同。 –