Sql server 使用不同的外部参数对存储过程中的评估进行评分

Sql server 使用不同的外部参数对存储过程中的评估进行评分,sql-server,stored-procedures,case-when,Sql Server,Stored Procedures,Case When,上下文: 我正在尝试为用户创建一个地方,以输入客户调查的答案。根据“XX月”参数,评分不同。因此,我引入了参数,并让一个存储过程计算分数,这样他们就不必通过纸张进行计算 问题: 我想到的东西比我想象的要大得多,更混乱(参见示例1)。我尝试在语句后加上一个大小写(参见示例2,就在声明的变量之后,但SQL不喜欢这样) 我愿意接受任何建议或帮助。我知道我在问什么,因此,如果你知道有其他地方可以阅读如何更好地做到这一点,我很高兴做一些研究(我自己还没有找到任何东西)。感谢你提供的任何帮助 示例1 CRE

上下文:

我正在尝试为用户创建一个地方,以输入客户调查的答案。根据“XX月”参数,评分不同。因此,我引入了参数,并让一个存储过程计算分数,这样他们就不必通过纸张进行计算

问题:

我想到的东西比我想象的要大得多,更混乱(参见示例1)。我尝试在语句后加上一个
大小写(参见示例2,就在声明的变量之后,但SQL不喜欢这样)

我愿意接受任何建议或帮助。我知道我在问什么,因此,如果你知道有其他地方可以阅读如何更好地做到这一点,我很高兴做一些研究(我自己还没有找到任何东西)。感谢你提供的任何帮助

示例1

CREATE PROCEDURE [dbo].[CCW_USER_HH_ASQSE2]
(
    [--In order to shorten this SQL statement just know this is where I put my external Parameters. For example :@QuestionnaireVersion VarChar(10)])
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE
         @Question1Score INT,
         @Question2Score INT,
         @Question3Score INT,
         @Question4Score INT,
         @Question5Score INT,
         @Question6Score INT,
         @Question7Score INT,
         @Question8Score INT

    SET @Question1Score = (CASE
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question1 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question1 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question1 = 'Rarely or Never' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question1 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question1 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question1 = 'Rarely or Never' THEN 10
                        End)
    SET @Question2Score = (CASE
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question2 = 'Often or Always' THEN 10
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question2 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question2 = 'Rarely or Never' THEN 0
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question2 = 'Often or Always' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question2 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question2 = 'Rarely or Never' THEN 0
                        End)
    SET @Question3Score = (CASE
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question3 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question3 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question3 = 'Rarely or Never' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question3 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question3 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question3 = 'Rarely or Never' THEN 10
                        End)
    SET @Question4Score = (CASE
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question4 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question4 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question4 = 'Rarely or Never' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question4 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question4 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question4 = 'Rarely or Never' THEN 10
                        End)
    SET @Question5Score = (CASE
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question5 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question5 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question5 = 'Rarely or Never' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question5 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question5 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question5 = 'Rarely or Never' THEN 10
                        End)
    SET @Question6Score = (CASE
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question6 = 'Often or Always' THEN 10
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question6 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question6 = 'Rarely or Never' THEN 0
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question6 = 'Often or Always' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question6 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question6 = 'Rarely or Never' THEN 0
                        End)
    SET @Question7Score = (CASE
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question7 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question7 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question7 = 'Rarely or Never' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question7 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question7 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question7 = 'Rarely or Never' THEN 10
                        End)
    SET @Question8Score = (CASE
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question8 = 'Often or Always' THEN 0
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question8 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '60 Month' AND @Question8 = 'Rarely or Never' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question8 = 'Often or Always' THEN 10
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question8 = 'Sometimes' THEN 5
                            WHEN @QuestionnaireVersion = '48 Month' AND @Question8 = 'Rarely or Never' THEN 0
                        End)
示例2

...
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE
        @Question1Score INT,
        @Question2Score INT,
        @Question3Score INT,
        @Question4Score INT,
        @Question5Score INT,
        @Question6Score INT,
        @Question7Score INT,
        @Question8Score INT

CASE
   WHEN @QuestionnaireVersion = '60 Month' THEN SET @Question1Score =...
   WHEN @QuestionnaireVersion = '48 Month' THEN SET @Question1Score =...
...

以下是我到目前为止的想法

我创建了两个“查找表”(LT_uasqse2_ZVX和LT_uasqse2_XVZ),并使用了一些IF-ELSE语句

此外,还有36个问题和9个不同的“月”调查。为了便于阅读,我缩短了它

USE [DEMO]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[CCW_USER_HH_ASQSE2]
(
@QuestionnaireVersion VarChar(10),
@DocID int,
@Question1 VarChar(20),
@Question2 VarChar(20),
@Question3 VarChar(20)
)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE
    @Question1Score INT,
    @Question2Score INT,
    @Question3Score INT

    IF @QuestionnaireVersion = '60 Month'
        BEGIN
            SET @Question1Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_ZVX
                                    WHERE QuestionAnswer = @Question1)
            SET @Question2Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_XVZ
                                    WHERE QuestionAnswer = @Question2)
            SET @Question3Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_XVZ
                                    WHERE QuestionAnswer = @Question3)
        END
    ELSE IF @QuestionnaireVersion = '48 Month'
        BEGIN
            SET @Question1Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_XVZ
                                    WHERE QuestionAnswer = @Question1)
            SET @Question2Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_ZVX
                                    WHERE QuestionAnswer = @Question2)
            SET @Question3Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_XVZ
                                    WHERE QuestionAnswer = @Question3)
        END
    ELSE IF @QuestionnaireVersion = '36 Month'
        BEGIN
            SET @Question1Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_XVZ
                                    WHERE QuestionAnswer = @Question1)
            SET @Question2Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_ZVX
                                    WHERE QuestionAnswer = @Question2)
            SET @Question3Score = (SELECT SCORE
                                    FROM LTC__ASQSE2_XVZ
                                    WHERE QuestionAnswer = @Question3)
        END
END

SELECT @Question1Score AS Question1Score, @Question2Score AS Question2Score, @Question3Score AS Question3Score

类似于
如果@QuestionnaireVersion='60个月'…做点什么
,但我不知道这是否真的会让你的代码缩短那么多。如果你创建了一个包含问题回复、答案和分数的表,然后你可以将用户输入加载到一个表中,将其连接到另一个表中,并对结果求和?这不是个坏主意。但是r、 共有9项调查。其中一项有36个问题,而最后一项有16个问题。并不是所有的答案都会得出相同的分值。因此,虽然我开始认为我无法摆脱它,但我希望能够简化它。创建另一个表似乎只是将大部分问题转移到某个地方你是这么想的,还是你另有想法?