存储过程未拉出子问题(LimeSurvey)SSMS

时间:2018-08-15 16:39:14

标签: sql-server stored-procedures ssms limesurvey

使用LimeSurvey从存储过程中查询数据,但是我无法获得T型来正确提取。带有多个答案的多选题(类型T)不起作用。寻找答案以显示结果。

使用LimeSurvey从存储过程中查询数据,但是我无法获得T型来正确提取。带有多个答案的多选题(类型T)不起作用。寻找答案以显示结果。

  USE [LimeSurvey]
GO
/****** Object:  StoredProcedure [dbo].[p_CreateFieldMapBailey2]    Script Date: 8/15/2018 8:21:29 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/*
                    Types "L", "!", "O", "D", "G", "N", "X", "Y", "5", "S", "T", "U"

                    Description                     Class Prefix        Legacy Character Code   Parent (if blank assume QuestionModule)
                    5 point choice                  FiveList            5   
                    List (dropdown)                 Select              !                       List
                    List (radio)                    List                L   
                    List with comment               CommentList         O                       List
                    Array                           RadioArray          F                       Array
                    Array(10 point choice)          TenRadioArray       B                       RadioArray
                    Array (5 point choice)          FiveRadioArray      A                       RadioArray
                    Array (Increase/Same/Decrease)  IDRadioArray        E                       RadioArray
                    Array (Numbers)                 NumberArray         :                       Array
                    Array (Texts)                   TextArray           ;                       Array
                    Array (Yes/No/Uncertain)        YNRadioArray        C                       RadioArray
                    Array by column                 ColumnRadioArray    H                       RadioArray
                    Array dual scale                DualRadioArray      1                       RadioArray
                    Date/Time                       Date                D   
                    Equation                        Equation            *   
                    File upload                     File                pipe character  
                    Gender                          Gender              G   
                    Language switch                 Language            I   
                    Multiple numerical input        Multinumerical      K   
                    Numerical input                 Numerical           N   
                    Ranking                         Ranking             R   
                    Text display                    Display             X   
                    Yes/No                          YN                  Y   
                    Huge free text                  HugeText            U                       Text
                    Long free text                  LongText            T                       Text
                    Multiple short text             Multitext           Q   
                    Short free text                 ShortText           S                       Text
                    Multiple choice                 Check               M   
                    Multiple choice with comments   CommentCheck        P                       Check
*/ 
/*
  Author: Thoraya Zedan
  Date: 3/18/2018
  Store procedure to map Lime Survey Questions and Answers.
  Tables used:
     * dbo.lime_questions
     * dbo.lime_groups 
     * dbo.lime_answers
     * dbo.lime_survey<sid> 
*/
ALTER Procedure [dbo].[p_CreateFieldMapBailey2](@surveryid int = '883877')
as
BEGIN
    SET NOCOUNT ON;
    /* Check if $sLanguage is a survey valid language (else $fieldmap is empty) */
    Declare @qid int, --Questiond ID
            @sid int, -- Survey ID
            @sqid int, -- Subquestion ID
            @gid int,  -- Group ID
            @scale_id int, 
            @specialtype nvarchar(10), 
            @defaultvalue nvarchar(10),
            @parent_qid int, -- Parent Question ID for SubQuestions
            @type varchar(1), -- Question Type
            @title nvarchar(max), -- Question Title
            @question nvarchar(max), -- Question Text
            @preg nvarchar(max) ,
            @help nvarchar(max),  
            @other varchar(1), 
            @mandatory varchar(1),
            @question_order int,
            @language varchar(20),
            @same_default int,
            @relevance varchar(max),
            @modulename nvarchar(255), 
            @SubQuestionsFound bit,
            @SQL nvarchar(max), -- for dynamic SQL
            @TableName nvarchar(100), -- Table name for survey responses
            @SurveyIDChar nvarchar(100), -- Convert Survey ID from int to varchar
            @column_name nvarchar(100), -- From data dictionary
            @DerivedColumnName nvarchar(100), -- Derived from code
            @ParentQuestion nvarchar(max), -- Parent Question is the main question for the subquestion group
            @Answer_Value nvarchar(max), -- Answer value, not the code
            @Answer_ValueFromCode nvarchar(max), -- Answer value for code based answers
            @stitle nvarchar(max), -- Subquestion Title
            @squestion nvarchar(max), -- Subquestion Text
            @squestion_order int, -- Subquestion Order
            @SubQuestionPaddedNumber nvarchar(10), -- Zero Padded number
            @AnswerColumnName nvarchar(100), -- The response table column name
            @id int, -- reponse ID from the response table
            @ParmDefinition nvarchar(1000) -- Parameter list

    -- Temp Table
    IF OBJECT_ID('tempdb..##TempLimeQuestionAnswers') IS NOT NULL
       DROP Table ##TempLimeQuestionAnswers
    IF OBJECT_ID('tempdb..##TempLimeReponse') IS NOT NULL
       DROP Table ##TempLimeReponse

    Set @DerivedColumnName = '';
    Set @SurveyIDChar = CAST(@surveryid as varchar(100));

    Set @TableName = 'lime_survey_' + @SurveyIDChar

    -- Prep Temp Answer Table
    Set @SQL='Select * into ##TempLimeReponse from '+ @TableName; 
    exec sp_executesql @SQL

    -- Answer Table Cursor
    declare curResponseTable cursor for 
    Select id from ##TempLimeReponse;

    -- Prep Temp Q&A Table 
    CREATE TABLE ##TempLimeQuestionAnswers(
    [id] int null,
    [qid] [int] NULL,
    [Column_Name] [nvarchar](max) NULL,
    [parent_qid] [int] NULL,
    [sid] [int] NULL,
    [gid] [int] NULL,
    [type] [varchar](1) NULL,
    [title] [nvarchar](20) NULL,
    [question] [nvarchar](max) NULL,
    [subquestion] [nvarchar](max) NULL,
    [Answer_Value] [nvarchar](max) NULL,
    [preg] [nvarchar](max) NULL,
    [help] [nvarchar](max) NULL,
    [other] [varchar](1) NULL,
    [mandatory] [varchar](1) NULL,
    [question_order] [int] NULL,
    [language] [varchar](20) NULL,
    [scale_id] [int] NULL,
    [same_default] [int] NULL,
    [relevance] [varchar](max) NULL,
    [modulename] [nvarchar](255) NULL   
    );

     Open curResponseTable
     Fetch Next from curResponseTable into @id
     While @@FETCH_STATUS = 0  
       BEGIN
            -- Main Query for Mapping
            declare curMainQuery cursor for
            SELECT [qid]
                  ,[parent_qid]
                  ,questions.[sid]
                  ,questions.[gid]
                  ,[type]
                  ,[title]
                  ,[question]
                  ,[preg]
                  ,[help]
                  ,[other]
                  ,[mandatory]
                  ,[question_order]
                  ,questions.[language]
                  ,[scale_id]
                  ,[same_default]
                  ,[relevance]
                  ,[modulename] 
             FROM dbo.lime_questions as questions, dbo.lime_groups as groups
             WHERE questions.gid=groups.gid AND 
                   questions.language=groups.language AND 
                   questions.parent_qid=0 AND
                   questions.sid = @surveryid
             ORDER BY group_order, question_order;

            Open  curMainQuery
            Fetch Next from curMainQuery into @qid,@parent_qid,@sid,@gid,@type,@title,@question,@preg,@help,@other,@mandatory,@question_order,@language,@scale_id,@same_default,@relevance,@modulename 
            WHILE @@FETCH_STATUS = 0  
            BEGIN  
                Set @SubQuestionsFound = 0; -- init value
                -- Derive the column name
                Set @DerivedColumnName = @SurveyIDChar + 'X' + Cast(@gid as nvarchar(100))  + 'X' + Cast(@qid as nvarchar(100)) ; --"{$arow['sid']}X{$arow['gid']}X{$arow['qid']}

                IF @other = 'Y'
                   Set @DerivedColumnName = @DerivedColumnName + 'other'

                -- Is this a comment field?
                IF @type = 'O'  
                    Set @DerivedColumnName = @DerivedColumnName + 'comment' 

                -- Multiple Comment
                 IF @type = 'P'  --$fieldname="{$arow['sid']}X{$arow['gid']}X{$arow['qid']}{$abrow['title']}comment"; 
                    Set @DerivedColumnName = @DerivedColumnName + @title + 'comment'

                    -- Multiple Choice
                 IF @type = 'T'   
                    Set @DerivedColumnName =  @SurveyIDChar + 'X' + Cast(@parent_qid as nvarchar(100))  + 'X' + Cast(@qid as nvarchar(100)) + 'SQ' + ''


                -- is this a subquestion? 
                IF (select count(*) from dbo.lime_questions where parent_qid = @qid) > 0 -- We have subquestions. Use the count not the question type
                   Begin
                        Set @DerivedColumnName = @SurveyIDChar + 'X' + Cast(@parent_qid as nvarchar(100))  + 'X' + Cast(@qid as nvarchar(100)) + 'SQ' + '';
                        Set @SubQuestionsFound = 1;
                        Set @ParentQuestion = @question; -- Since the cursor has parent_id=0 we know this is the parent question. 

                        --Find all subquestions
                        -- Cursor for parent_id 
                        declare curSubQuestion cursor for
                        select qid, title, question, question_order from dbo.lime_questions
                         where [sid] = @sid
                          and  gid = @gid 
                          and  parent_qid = @qid
                        order by question_order;

                        Open curSubQuestion
                        Fetch Next From curSubQuestion into @sqid, @stitle, @squestion, @squestion_order
                        WHILE @@FETCH_STATUS = 0  
                        BEGIN  
                        -- Loop
                            Set @SubQuestionPaddedNumber = Replace(STR(@squestion_order,3), '', ''); -- padd with zeros
                            Set @AnswerColumnName = @SurveyIDChar + 'X' + Cast(@parent_qid as nvarchar(100))  + 'X' + Cast(@qid as nvarchar(100)) + 'SQ' + '';
                            -- Get the answer
                            SET @ParmDefinition = N'@Answer_Value nvarchar(100) output'
                            Set @SQL = 'Select @Answer_Value= ['+ @AnswerColumnName +'] From ##TempLimeReponse where id =' + CAST(@id as nvarchar(100))
                            exec sp_executesql @SQL, @ParmDefinition, @Answer_Value=@Answer_Value output

                            Insert into ##TempLimeQuestionAnswers(
                                   [id],[qid],[Column_Name],[parent_qid],[sid],[gid],[type],[title],[question],[SubQuestion],[Answer_Value],[preg],[help],[other],[mandatory],[question_order],[language],[scale_id],[same_default],[relevance],[modulename])
                            Values(@id, @sqid,@AnswerColumnName, @parent_qid, @sid, @gid, @type, @stitle, @question, @squestion, @Answer_Value,@preg, @help, @other, @mandatory, @squestion_order, @language, @scale_id, @same_default, @relevance, @modulename );
                            Fetch Next From curSubQuestion into @sqid, @stitle, @squestion, @squestion_order
                       END -- curSubQuestions
                       CLOSE curSubQuestion  
                       DEALLOCATE curSubQuestion         
                   End -- Array Questions
                IF @SubQuestionsFound = 0
                   Begin                       
                        -- Get the answer
                        SET @ParmDefinition = N'@Answer_Value nvarchar(100) output'
                        Set @SQL = 'Select @Answer_Value= ['+ @DerivedColumnName +'] From ##TempLimeReponse where id =' + CAST(@id as nvarchar(100))
                        exec sp_executesql @SQL, @ParmDefinition, @Answer_Value=@Answer_Value output
                        -- Check if this is a code
                        IF (select count(*) from dbo.lime_answers where qid = @qid) > 0
                           BEGIN
                                Select @Answer_ValueFromCode = [answer] From dbo.lime_answers where qid = @qid and code = @Answer_Value;
                                Set @Answer_Value = @Answer_ValueFromCode;
                           END 
                        Insert into ##TempLimeQuestionAnswers(
                                [id],[qid],[Column_Name],[parent_qid],[sid],[gid],[type],[title],[question],[Answer_Value], [preg],[help],[other],[mandatory],[question_order],[language],[scale_id],[same_default],[relevance],[modulename])
                        Values(@id,@qid,@DerivedColumnName, @parent_qid, @sid, @gid, @type, @title, @question, @Answer_Value, @preg, @help, @other, @mandatory, @question_order, @language, @scale_id, @same_default, @relevance, @modulename );
                   End      
                Fetch Next from curMainQuery into @qid,@parent_qid,@sid,@gid,@type,@title,@question,@preg,@help,@other,@mandatory,@question_order,@language,@scale_id,@same_default,@relevance,@modulename            
            END -- curMainQuery
            Close curMainQuery;
            Deallocate curMainQuery;        
            Fetch Next from curResponseTable into @id
    End --curResponseTable
    Close curResponseTable;     
    Deallocate curResponseTable;
        -- Replace the Select with an insert statement to place in a table. 
    Select * from ##TempLimeQuestionAnswers;
    -- Temp Table
    IF OBJECT_ID('tempdb..##TempLimeQuestionAnswers') IS NOT NULL
       DROP Table ##TempLimeQuestionAnswers
    IF OBJECT_ID('tempdb..##TempLimeReponse') IS NOT NULL
       DROP Table ##TempLimeReponse
END

0 个答案:

没有答案