Автоинкрементная переменная внутри хранимой процедуры - PullRequest
0 голосов
/ 10 марта 2020

У меня есть процедура, которая сохраняет ответы от пользователей, которые отвечают на опрос. В моей базе данных есть 3 таблицы SurveyData, SurveyQuestions и SurveyAnswers.

SurveyData хранит данные от пользователя

IdData || Name || Ocupation

SurveyQuestions содержит все доступные вопросы

IdQuestion || Question
1          || question 1
2          || question 2 ...

И SurveyAnswers, в котором хранятся ответы пользователя

IdData || IdQuestion || Answer

У меня есть 10 вопросов в моей базе данных, и я хочу, чтобы StoredProcedure вставлял в столбец IdQuestion значения от 1 до 10, и когда другой пользователь отвечает, чтобы перезапустить это число от 1 до 10 снова

Это мой текущий SP

USE [Surveys]
GO
/****** Object:  StoredProcedure [usurvey].[InsertSurvey] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [usurvey].[InsertSurvey] @Name varchar(50), @Ocupation varchar(50), @replies varchar(2000)
as begin
DECLARE @idData int
declare @posreply int
declare @reply varchar(20)
    begin
    INSERT INTO SurveyData(Name,Ocupation)
    VALUES (@Name,@Ocupation)
    SET @idData=(SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY])

    end
    if (@replies <> '')
    begin
        while PATINDEX ('%|%', @replies) <> 0
        begin
            select @posreply = PATINDEX('%|%',@replies)
            select @reply = left(@replies,@posreply -1)
            insert into SurveyAnswers (idData, idQuestion, Answer)
            select @idData,ROW_NUMBER() OVER (order by (select null)),@reply
            select @replies = STUFF(@replies, 1, @posreply,'')
        end
    end
END

Когда я выполняю SP

exec InsertarSurvey @Name = 'john', @Ocupation = 'teacher' , @respuestas = 'almost never|never|always|'

Это результат о выполнении

IdData || IdQuestion || Answer
1      || 1          || almost never
1      || 1          || never
1      || 1          || always

И вот результаты, которые я хочу получить

IdData || IdQuestion || Answer
1      || 1          || almost never
1      || 2          || never
1      || 3          || always

И если кто-то еще завершит опрос

IdData || IdQuestion || Answer
1      || 1          || almost never
1      || 2          || never
1      || 3          || always
2      || 1          || never
2      || 2          || never
2      || 3          || almost always

1 Ответ

0 голосов
/ 10 марта 2020

Вместо того, чтобы делать все oop, вы можете использовать STRING_SPLIT вместе с функцией ROW_NUMBER.

DECLARE @replies varchar(2000) = 'almost never|never|always|'
SELECT value, ROW_NUMBER() OVER (order by (select null)) FROM STRING_SPLIT(@replies,'|')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...