2017-01-01 3 views
0

Вот мой SQL-запрос, когда я его выполняю, появляется ошибка, показанная ниже. Я новичок в SQL Server, может ли кто-нибудь объяснить, в чем причина этой ошибки? Как установить этот запрос SQL JOIN в переменную?Как установить значение запроса для выходной переменной в хранимой процедуре

ALTER PROC spGetFullLog 
    @PatientID varchar(10), 
    @PatientD nvarchar(255) output 
WITH ENCRYPTION 
AS 
BEGIN 
    SELECT 
     @PatientD = First_Name, 
     Last_Name, 
     dbo.CalculateAge(Date_of_Birth) AS Age, 
     Admitted_Date, Patient_Condition, 
     Medicine_Prescribed, Treatment_Advice, 
     Treatments_Given, Date_of_Discharged, 
     Diagnosis, Treatments, 
     Date_of_operation, Typpe_of_operation, 
     Condition_Before, Condition_After 
    FROM 
     Patients_Main 
    FULL JOIN 
     Admitted_Patients ON Patients_Main.Patient_ID = Admitted_Patients.Patient_ID 
    LEFT JOIN 
     Discharged_Patients ON Patients_Main.Patient_ID = Discharged_Patients.Patient_ID 
    LEFT JOIN 
     Patient_Consultation_Details ON Patients_Main.Patient_ID = Patient_Consultation_Details.Patient_ID 
    LEFT JOIN 
     Operation ON Patients_Main.Patient_ID = Operation.Patient_ID 
    LEFT JOIN 
     Patient_Conditon ON Patients_Main.Patient_ID = Patient_Conditon.Patient_ID 
    WHERE 
     Patients_Main.Patient_ID = @PatientID 
END 

Это код, который я использовал для выполнения этой хранимой процедуры

DECLARE @Details nvarchar(255) 
EXECUTE spGetFullLog 'PT0001', @Details output 
print @Details 

Это ошибка

Msg 141, Level 15, State 1, процедура spGetFullLog, строка 7
Оператор SELECT, который присваивает значение переменной, не должен комбинироваться с операциями поиска данных.

+0

Попробуйте запустить это снова ** БЕЗ ** 'PatientD ='. Я предполагаю, что вы не получите сообщение об ошибке. Если я прав, это означает, что вы либо предоставляете переменные всем извлеченным полям, либо никому. Если вам нужна процедура для возврата набора записей со всеми полями, вы можете просто получить все значения в локальные переменные, делать все, что вам нужно (с переменной 'PatientD'), а затем подразумевать **' SELECT' ** все переменные перед возвратом. – FDavidov

+0

@Spiderman: _complex и tricky_ ?? Ты серьезно? – FDavidov

+0

Одно дополнительное наблюдение: вы устанавливаете условие как 'WHERE Patients_Main.Patient_ID = @ PatientID'. Попробуйте 'WHERE Patients_Main.Patient_ID = First_Name' (после удаления назначения в начале). – FDavidov

ответ

0

Ошибка, которую вы получаете, объясняет, что вы делаете неправильно, - вы не можете устанавливать значения переменных, а также извлекать значения в одном запросе. Вы должны использовать 2 запросов, чтобы получить результаты, которые вы хотите:

ALTER PROC spGetFullLog 
    @PatientID varchar(10), 
    @PatientD nvarchar(255) output 
WITH ENCRYPTION 
AS 
BEGIN 

    SELECT 
     @PatientD = First_Name 
    FROM 
     Patients_Main 
    WHERE 
     Patient_ID = @PatientID; 

    SELECT 
     Last_Name, 
     dbo.CalculateAge(Date_of_Birth) AS Age, 
     Admitted_Date, Patient_Condition, 
     Medicine_Prescribed, Treatment_Advice, 
     Treatments_Given, Date_of_Discharged, 
     Diagnosis, Treatments, 
     Date_of_operation, Typpe_of_operation, 
     Condition_Before, Condition_After 
    FROM 
     Patients_Main 
    FULL JOIN 
     Admitted_Patients ON Patients_Main.Patient_ID = Admitted_Patients.Patient_ID 
    LEFT JOIN 
     Discharged_Patients ON Patients_Main.Patient_ID = Discharged_Patients.Patient_ID 
    LEFT JOIN 
     Patient_Consultation_Details ON Patients_Main.Patient_ID = Patient_Consultation_Details.Patient_ID 
    LEFT JOIN 
     Operation ON Patients_Main.Patient_ID = Operation.Patient_ID 
    LEFT JOIN 
     Patient_Conditon ON Patients_Main.Patient_ID = Patient_Conditon.Patient_ID 
    WHERE 
     Patients_Main.Patient_ID = @PatientID 
END 
+0

Woow it's working, спасибо :) – Rooter

0

Вы можете не только назначить частичную колонку переменной. Вы должны делать это отдельно.

ALTER PROC spGetFullLog 
    @PatientID varchar(10), 
    @PatientD nvarchar(255) output 
WITH ENCRYPTION 
AS 
BEGIN 
    SELECT 
     @PatientD = First_Name 
    FROM Patients_Main 
    WHERE Patients_Main.Patient_ID = @PatientID 


    SELECT 
    @PatientD = First_Name 
    Last_Name, 
    dbo.CalculateAge(Date_of_Birth) AS Age, 
    Admitted_Date, Patient_Condition, 
    Medicine_Prescribed, Treatment_Advice, 
    Treatments_Given, Date_of_Discharged, 
    Diagnosis, Treatments, 
    Date_of_operation, Typpe_of_operation, 
    Condition_Before, Condition_After 
FROM 
    Patients_Main 
FULL JOIN 
    Admitted_Patients ON Patients_Main.Patient_ID = Admitted_Patients.Patient_ID 
LEFT JOIN 
    Discharged_Patients ON Patients_Main.Patient_ID = Discharged_Patients.Patient_ID 
LEFT JOIN 
    Patient_Consultation_Details ON Patients_Main.Patient_ID = Patient_Consultation_Details.Patient_ID 
LEFT JOIN 
    Operation ON Patients_Main.Patient_ID = Operation.Patient_ID 
LEFT JOIN 
    Patient_Conditon ON Patients_Main.Patient_ID = Patient_Conditon.Patient_ID 
WHERE 
    Patients_Main.Patient_ID = @PatientID 
END 
+0

Спасибо, дорогой :) – Rooter

+0

@Nolan Я думаю, что этот код все еще встречается с такой ошибкой, еще раз проверьте эту строку :) PatientD = First_Name Last_Name, – SMW

+0

Вы имеете в виду @PatientD должно быть имя concat фамилия? то будет: @ PatientD = ISNULL (FirstName + '', '') + ISNULL (LastName, '') –

0

Я думал, что это стоит объяснить, почему то, что вы делаете не имеет никакого смысла.

Вы пытаетесь присвоить значение переменной @PatientD. [Предполагая, что оператор будет синтаксически законным, а это не является]. Значение, которое будет использоваться, является результатом фильтрации данных, поэтому только после завершения процесса фильтрации выполняется присвоение. Следовательно, использование той же переменной, что и часть фильтра, означает, что переменная не имеет никакого значения, назначенного во время процесса фильтрации. Вид CATCH 22 предмет.

Надеюсь, что это стало для вас более ясным.

+0

Не совсем. Существуют две переменные: Пациент ** I ** D и PatientD. Первый используется для фильтрации запроса, а второй используется для вывода результатов. –

+0

@ ZoharPeled, OOOPPPSS !!!!! Ну, кто-то должен будет объяснить OP несколько вещей об именах переменных ... Спасибо за исправление. – FDavidov

+0

Я полностью согласен. –

Смежные вопросы