2013-02-18 2 views
3

하위 쿼리가 포함 된 Webservice에서 사용하는 쿼리가 있습니다. SQL Server Management Studio에서 쿼리를 실행할 때 제대로 작동합니다. 그러나, SqlCommand으로 웹 서비스에서 이것을 사용하여, 내가 얻을 :System.Data.SqlCommand (C#)에서 하위 쿼리 사용 - SQL Server Mgmt Studio에서 작동하는 구문 오류

System.Data.SqlClient.SqlException : 잘못된 구문 키워드 '가입하기'근처를. 'AS'키워드 근처에 잘못된 구문이 있습니다.

추가 문자를 삽입하면 오류가 하위 쿼리 바로 다음 위치를 나타냅니다.

쿼리는 다음과 같습니다 :

SELECT H.H_ID AS ID, H.Name, TD.TDValue, A.A_ID, A_C.Value 
FROM 
    H CROSS JOIN 
     A JOIN 
      (SELECT TD.A_ID, TD.H_ID, MAX(cast(TD.Version AS bigint)) AS Version FROM TD GROUP BY TD.A_ID, TD.H_ID) AS TData ON TData.H_ID = H.H_ID AND TData.A_ID = A.A_ID LEFT JOIN 
       TD2 ON TD2.H_ID = H.H_ID AND TD2.A_ID = A.A_ID AND TD2.Version = TData.Version LEFT JOIN 
        A_C ON A_C.A_ID = A.A_ID AND cast(A_C.R AS CHAR) = cast(TD.TDValue AS CHAR) 
WHERE (H.Info = 1); 

서브 쿼리

이 테이블 TD의 항목의 마지막 버전을 얻을 필요합니다. 더 좋은 방법이 있다면 저도 알려주세요. :-)

MS SQL에 존재하지 않는 C#의 SqlCommand에는 제한이 있습니까? 아니면 잘못된 것이 있습니까?

나는 많은 도움을 주셔서 감사합니다.

+0

대신 저장 프로 시저를 사용하지 않는 이유는 무엇입니까? –

+0

정말 유감입니다. 두 시간의 연구로 제 코드를 확인하게되었습니다 : 문자열로 묶어서 줄의 끝 부분 (또는 시작 부분)에 공백을 남겼습니다 ... 너무 짜증나게합니다! – user2083834

답변

0

공통 테이블 식을 사용하면이 경우보다 효율적이라고 생각합니다. 나는 데이터베이스 구조와 데이터 요구 사항을 알지 못하기 때문에 이것이 정확히 당신이 필요로하는 100 %는 아니지만 도움이 될 것입니다.

;with 
cte_Tdata AS 
(
    SELECT 
     TD.A_ID 
     ,TD.H_ID 
     ,MAX(cast(TD.Version AS bigint)) AS Version 
    FROM 
     TD 
    GROUP BY 
     TD.A_ID 
     ,TD.H_ID 
),cte_TD AS 
(
    SELECT 
     TD.A_ID 
     ,TD.H_ID 
     ,TD.TDValue 
    FROM 
     TD 
) 
SELECT H.H_ID AS ID, H.Name, cte_TD.TDValue, A.A_ID, A_C.Value 
FROM 
    H CROSS JOIN 
     A JOIN cte_Tdata ON cte_Tdata.H_ID = H.H_ID 
        AND cte_Tdata.A_ID = A.A_ID 
      INNER JOIN cte_TD ON cte_Tdata.H_ID = cte_TD.H_ID 
          AND cte_Tdata.A_ID = cte_TD.A_ID 
      LEFT JOIN A_C ON A_C.A_ID = A.A_ID 
         AND cast(A_C.R AS CHAR) = cast(cte_TD.TDValue AS CHAR) 
     LEFT JOIN TD2 ON TD2.H_ID = H.H_ID 
        AND TD2.A_ID = A.A_ID 
        AND TD2.Version = cte_Tdata.Version 

WHERE 
    H.Info = 1;