2013-08-21 3 views
0

행을 삽입 할 때 :실행 저장 프로 시저/UDF X 번호는 PROC 내가처럼 보이는 저장 프로 시저를 가지고

create proc spInsertDrugQuestions 
@drugId int 
as 
begin 
declare @drugName varchar(50)= (select distinct drugName 
     from Drugs 
     where DrugId = @drugId) 
--class question and answer 
declare @drugClassQuestion varchar(250) = 
     'What is the drug class of your ' + @drugName   

declare @drugClassAnswer varchar(50) = (select distinct drugClass 
      from drugs 
      where drugId = @drugId) 
--dosage question and answer 
declare @drugDosageQuestion varchar(250) = 
     'What is the dosage of your ' + @drugName 

declare @drugDosageAnswer varchar(50) = (select distinct drugDosage 
      from drugs 
      where drugId = @drugId) 

--QuizQuestionTypeId is a foreign key to another table not shown 
--but indicates the general type of question (dosage, class, etc.) 
insert into DrugQuestions(DrugId,DrugQuestion,CorrectAnswer,QuizQuestionTypeId) 
values (@drugId,@drugClassQuestion,@drugClassAnswer,3) 
    ,(@drugId,@drugDosageQuestion,@drugDosageAnswer,1) 
end 

이 저장 프로 시저는 Drugs에 새로운 정보를 입력 최종 사용자입니다 테이블과 해당 질문이 DrugQuestions 테이블에 추가됩니다. 당분간, Drugs 테이블에 현재 존재하는 모든 DrugId에 대해이 저장 프로 시저를 실행할 수 있어야합니다. 최선의 방법은 과 CROSS APPLY이 모두 DrugId 인 숫자 표에 가입하는 것입니다. 그러나, 나는 UDF에 너무 익숙하지 않아요 및

create function fnInsertDrugQuestions(@drugId int) 
returns int --think can't be right, but it didn't give me any read squigglies 
as begin 
declare @drugName varchar(50)= (select distinct drugName 
     from Drugs 
     where DrugId = @drugId) 
--class question and answer 
declare @drugClassQuestion varchar(250) = 
     'What is the drug class of your ' + @drugName   

declare @drugClassAnswer varchar(50) = (select distinct drugClass 
      from drugs 
      where drugId = @drugId) 
--dosage question and answer 
declare @drugDosageQuestion varchar(250) = 
     'What is the dosage of your ' + @drugName 

declare @drugDosageAnswer varchar(50) = (select distinct drugDosage 
      from drugs 
      where drugId = @drugId) 
insert into DrugQuestions(DrugId,DrugQuestion,CorrectAnswer,QuizQuestionTypeId) 
values (@drugId,@drugClassQuestion,@drugClassAnswer,3) 
    ,(@drugId,@drugDosageQuestion,@drugDosageAnswer,1) 

end 

나에게 오류를 제공하는 다음과 같은 시도 :

Msg 443, Level 16, State 15, Procedure fnInsertDrugQuestions, Line 21 
Invalid use of a side-effecting operator 'INSERT' within a function. 
Msg 455, Level 16, State 2, Procedure fnInsertDrugQuestions, Line 21 
The last statement included within a function must be a return statement. 

내가 몇 가지를 알아야합니다 :

1.) Is it possible to insert data like this using a UDF? 
2.) Is it possible to used `CROSS APPLY` with a stored procedure? 
3.) Do I really want to loop through all the `DrugId`s to do this? 

답변

1
  1. 을 아니요 - 데이터를 삽입하려는 경우 저장 프로 시저를 사용하면 은 필요한 경우 저장 프로 시저에서 데이터를 반환 할 수 있습니다.
  2. 예 - 저장 프로 시저에서 CROSS APPLY를 사용할 수 있습니다.
  3. 없음 - 당신은 현재의 모든 약물을 삽입하려면 다음 사용할 수, 그것은 일회성으로 수행되고 특히 : 당신이 대량 경우

INSERT DrugQuestions (DrugId, DrugQuestion, CorrectAnswer, QuizQuestionTypeId) 
SELECT DrugID, 
     DrugQuestion = t.Question + drugs.DrugName, 
     CorrectAnswer = t.Answer, 
     t.QuizQuestionTypeId 
FROM drugs 
     CROSS APPLY 
     ( VALUES 
       ('What is the drug class of your ', drugs.DrugClass, 3), 
       ('What is the dosages of your ', drugs.drugDosage, 1) 
     ) t (Question, Answer, QuizQuestionTypeId); 

가 삽입 약물이 여러 약물 즉, 사용자로부터 한 번에 각 신약에 대해 동일한 기능을 반복하는 대신 출력 조항을 사용하여 신약 ID를 수집 한 다음 위와 결합하여 새로운 질문을 추가 할 수 있습니다.

DECLARE @NewDrugIDs TABLE (ID INT NOT NULL); 
INSERT Drugs (DrugName, DrugDosage, DrugClass, ...) 
OUTPUT inserted.drugID INTO @NewDrugIDs 
SELECT/VALUES ... 

INSERT DrugQuestions (DrugId, DrugQuestion, CorrectAnswer, QuizQuestionTypeId) 
SELECT DrugID, 
     DrugQuestion = t.Question + drugs.DrugName, 
     CorrectAnswer = t.Answer, 
     t.QuizQuestionTypeId 
FROM drugs 
     CROSS APPLY 
     ( VALUES 
       ('What is the drug class of your ', drugs.DrugClass, 3), 
       ('What is the dosages of your ', drugs.drugDosage, 1) 
     ) t (Question, Answer, QuizQuestionTypeId) 
WHERE drugs.DrugID IN (SELECT ID FROM @NewDrugIDs); 
+0

나는'OUTPUT'..INTO' 절을 몰랐다. 신난다, 항상 당신의 인생을 더 쉽게 만들기 위해 새로운 것을 배울 수 있습니다. – wootscootinboogie

관련 문제