2017-01-01 74 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 

這是錯誤

消息141,級別15,狀態1,過程spGetFullLog代碼,行7
將值賦給變量的SELECT語句不能與數據檢索操作結合使用。

+0

嘗試再次運行** WITHOUT **'PatientD ='。我的猜測是你不會收到錯誤信息。如果我是正確的,這意味着您要麼爲所有提取的字段提供變量,要麼不提供變量。如果你需要程序返回一個包含所有字段的記錄集,你可以簡單地把所有的值都變成局部變量,做任何你必須做的事(用變量'PatientD'),然後隱含**'SELECT' **返回前的所有變量。 – FDavidov

+0

@Spiderman:_complex and 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

哇,它的工作,謝謝:) – 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

我完全同意。 –

相關問題