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