2011-02-23 59 views
-2

我想在下面的格式檢索數據:的爲什麼我在我的查詢中獲取SQL語法錯誤?

Story | Story Type | Creation Date | Company Role | Tag 1 | Tag 2 | Tag 3 
negative iii | Negative | 21/02/2011 | Business Analyst | Project Duration | Team Size | Process 
negative ccc | Negative | 22/02/2011 | Admin | Workspace Layout | Organisational | Process 

代替:

Story | StoryCategoryID | CreationDate | CompanyRole | Name 
negative iii | 1 | 21/02/2011 | Business Analyst | Project Duration 
negative iii | 1 | 21/02/2011 | Business Analyst | Team Size 
negative iii | 1 | 21/02/2011 | Business Analyst | Process 
negative ccc | 1 | 22/02/2011 | Admin | Workspace Layout 
negative ccc | 1 | 22/02/2011 | Admin | Organisational and Reporting Structure  
negative ccc | 1 | 22/02/2011 | Admin | Process 

,但我收到以下錯誤:

1)附近有語法錯誤關鍵字AS,

2)Z附近語法不正確

這是我的SQL,請幫忙!

SELECT 
    Story, 
    CASE StoryCategoryID 
     WHEN 1 THEN 'Negative' 
     WHEN 0 THEN 'Positive' 
     ELSE CAST(StoryCategoryID as varchar(10)) as StoryCategoryID, 
    CreationDate, 
    CompanyRole, 
    MAX(CASE WHEN Z.MinName = af2.Name THEN af2.Name ELSE '' END) as Tag1 , 
    MAX(CASE WHEN Z.MinName <> af2.Name AND Z.MaxName <> af2.Name THEN af2.Name ELSE '' END) as Tag2, 
    MAX(CASE WHEN Z.MaxName = af2.Name THEN af2.Name ELSE '' END) as Tag3 
FROM (SELECT s.Story , s.StoryCategoryID , 
       CONVERT(VARCHAR(10), s.CreationDate, 103) AS CreationDate , 
       m.CompanyRole , af.AgileFactorID , MIN(af.Name) MinName , 
       MAX(af.Name) MaxName 
     FROM Story s 
     INNER JOIN ProjectIterationMember pm 
       ON pm.ProjectIterationMemberID = s.ProjectIterationMemberID 
     INNER JOIN Iterations i  
       ON i.ProjectIterationID = pm.ProjectIterationID 
     INNER JOIN Member m ON m.MemberID = pm.MemberID 
     INNER JOIN ProjectStoryFactors psf ON psf.StoryID = s.StoryID 
     INNER JOIN AgileFactors af ON af.AgileFactorID = psf.AgileFactorID 

     WHERE i.ProjectID = '" + proj_id + "'" 
     GROUP BY s.Story, 
       s.StoryCategoryID, 
       CONVERT(VARCHAR(10), s.CreationDate, 103), 
       m.CompanyRole, af.AgileFactorID) Z 
    INNER JOIN AgileFactors af2 ON af2.AgileFactorID = Z.AgileFactorID 
    GROUP BY Story, StoryCategoryID, CreationDate, CompanyRole 
+0

您是否嘗試過縮進代碼並註釋掉區塊以縮小錯誤的位置? – 5arx 2011-02-23 23:15:58

+1

你可以用空白格式表示SQL並重新發布嗎? – Oliver 2011-02-23 23:15:58

回答

4

即SQL是不可讀:

SELECT 
Story, 
CASE StoryCategoryID WHEN 1 THEN 'Negative' WHEN 0 THEN 'Positive' 
ELSE CAST(StoryCategoryID as varchar(10)) as StoryCategoryID, 
CreationDate, 
CompanyRole, 
MAX(CASE WHEN Z.MinName = af2.Name THEN af2.Name ELSE '' END) as Tag1 , 
MAX(CASE WHEN Z.MinName <> af2.Name AND Z.MaxName <> af2.Name THEN af2.Name 
ELSE '' END) as Tag2, 
MAX(CASE WHEN Z.MaxName = af2.Name THEN af2.Name ELSE '' END) as Tag3 
FROM (SELECT s.Story , s.StoryCategoryID , CONVERT(VARCHAR(10), s.CreationDate, 
103) AS CreationDate , 
m.CompanyRole , af.AgileFactorID , MIN(af.Name) MinName , 
MAX(af.Name) MaxName FROM Story s 
INNER JOIN ProjectIterationMember pm ON pm.ProjectIterationMemberID = 
s.ProjectIterationMemberID INNER JOIN Iterations i  
ON i.ProjectIterationID = pm.ProjectIterationID INNER JOIN Member m  
ON m.MemberID = pm.MemberID INNER JOIN ProjectStoryFactors psf  
ON psf.StoryID = s.StoryID INNER JOIN AgileFactors af  
ON af.AgileFactorID = psf.AgileFactorID WHERE i.ProjectID = '" + proj_id + "'" 
GROUP BY s.Story, s.StoryCategoryID, CONVERT(VARCHAR(10), s.CreationDate, 103), 
m.CompanyRole, af.AgileFactorID) Z INNER JOIN AgileFactors af2  
ON af2.AgileFactorID = Z.AgileFactorID 
GROUP BY Story, StoryCategoryID, CreationDate, CompanyRole; 

至少組織它,因此結構的關鍵字是可見的:

SELECT Story, 
     CASE StoryCategoryID WHEN 1 THEN 'Negative' WHEN 0 THEN 'Positive' 
     ELSE CAST(StoryCategoryID as varchar(10)) as StoryCategoryID, 
     CreationDate, 
     CompanyRole, 
     MAX(CASE WHEN Z.MinName = af2.Name THEN af2.Name ELSE '' END) as Tag1, 
     MAX(CASE WHEN Z.MinName <> af2.Name AND Z.MaxName <> af2.Name 
      THEN af2.Name ELSE '' END) as Tag2, 
     MAX(CASE WHEN Z.MaxName = af2.Name THEN af2.Name ELSE '' END) as Tag3 
    FROM (SELECT s.Story, s.StoryCategoryID, 
       CONVERT(VARCHAR(10), s.CreationDate, 103) AS CreationDate, 
       m.CompanyRole, af.AgileFactorID, MIN(af.Name) MinName, 
       MAX(af.Name) MaxName 
      FROM Story s 
      JOIN ProjectIterationMember pm 
      ON pm.ProjectIterationMemberID = s.ProjectIterationMemberID 
      JOIN Iterations i ON i.ProjectIterationID = pm.ProjectIterationID 
      JOIN Member m  ON m.MemberID = pm.MemberID 
      JOIN ProjectStoryFactors psf ON psf.StoryID = s.StoryID 
      JOIN AgileFactors af ON af.AgileFactorID = psf.AgileFactorID 
     WHERE i.ProjectID = '" + proj_id + "'" 
     GROUP BY s.Story, s.StoryCategoryID, 
       CONVERT(VARCHAR(10), s.CreationDate, 103), 
       m.CompanyRole, af.AgileFactorID) Z 
    JOIN AgileFactors af2 ON af2.AgileFactorID = Z.AgileFactorID 
GROUP BY Story, StoryCategoryID, CreationDate, CompanyRole 

符號'" + proj_id + "'"表明這是從編程語言的字符串中提取的;這是對SQL注入的公開邀請。在純SQL環境中,它在語法上是無效的;最後你有一個流浪的雙引號。

1

@JonathanLeffler說了些什麼。 另外,你還缺少逗號: MIN(af.Name)MinName,

MAX(af.Name)MaxName 時間關閉MAC上牀睡覺: -o

+0

我怎麼錯過逗號? – user618616 2011-02-23 23:38:55

+0

對不起,我的鯡魚 - 我的眼睛在你原來的帖子中編輯代碼後被打亂:-o – 5arx 2011-02-23 23:46:16

+0

如果語法沒問題,那我爲什麼會得到那兩個錯誤? Z和AS附近存在問題... – user618616 2011-02-23 23:49:06