2013-05-29 2 views
0

,이를 사용하여 SQL 쿼리를 호출합니다. 변수는 쉼표로 구분 된 숫자 목록 인 문자열입니다 (예 : '1,2,3').Select 문은 마이크로 소프트 SQL 서버 2005, 고전적인 ASP 코드에서

문자열 포맷 도착 후의 예는 다음과 같습니다

select HireResponseID, HireResponse, DateResponse, Comments, YearFileOpened, file_number, isCaseOpen, last_update, isConfidential, date_created, OurClient, TheirClient, ProjectName, description, lawyer_lastname, lawyer_firstname, Conflicts.ConflictID 
from Hire_Response, Conflicts, Lawyers 
WHERE Hire_Response.ConflictID=Conflicts.ConflictID AND Lawyers.lawyerID=Conflicts.lawyerID AND firmID IN (47,140,138,137,139) AND HireID = 594 AND isStillaConflict = 1 
ORDER BY file_number, TheirClient, OurClient, lawyer_lastname, lawyer_firstname 

지금 내가 저장 프로 시저에이를 켜려고합니다. 그래서

selectHireResponseSQL = " 
       EXEC ps_selectHireResponseSQL '" & FirmIDString & "'," & HireID 

에 ASP 고전적인 코드를 변경 및 저장 프로 시저는 다음과 같습니다

SELECT HireResponseID, HireResponse, DateResponse, Comments, YearFileOpened 
     , file_number, isCaseOpen, last_update, isConfidential, date_created 
     , OurClient, TheirClient, ProjectName, DESCRIPTION, lawyer_lastname 
     , lawyer_firstname, Conflicts.ConflictID 
    FROM Hire_Response 
     , Conflicts 
     , Lawyers 
WHERE Hire_Response.ConflictID = Conflicts.ConflictID 
    AND Lawyers.lawyerID = Conflicts.lawyerID 
    AND CHARINDEX(',' + CAST(firmID AS NVARCHAR) + ',',','[email protected] + ',') >0 
    AND HireID = @HireID 
    AND isStillaConflict = 1 
ORDER BY 
     file_number 
     , TheirClient 
     , OurClient 
     , lawyer_lastname 
     , lawyer_firstname 

하지만 지금은 전혀 모든 레코드를 (코드 불구하고 오류없이 실행하는 것) 받고 있지 않다. 레코드를 가져와야한다는 것을 알고 있습니다. 저장 프로 시저로 전환하면 레코드가 생기기 때문입니다.

여기에 무슨 문제가 있는지 알고 계시나요?

select HireResponseID, HireResponse, DateResponse, Comments, YearFileOpened, file_number, 
     isCaseOpen, last_update, isConfidential, date_created, OurClient, TheirClient, 
     ProjectName, description, lawyer_lastname, lawyer_firstname, Conflicts.ConflictID 
from Conflics c join 
    Hire_Response hr 
    on hr.ConflictID=c.ConflictID join 
    Lawyers l 
    on l.lawyerID=c.lawyerID 
WHERE CHARINDEX(',' + CAST(firmID as varchar(30)) + ',', ',' + @FirmIDString + ',') > 0 
    AND HireID = @HireID 
    AND isStillaConflict = 1 
ORDER BY file_number, TheirClient, OurClient, lawyer_lastname, lawyer_firstname; 

이 문제가 해결되지 않습니다 :

+2

이 코드는 SQL 주입 공격에 취약합니다. 당신은 실제로 해킹 당하고 있습니다. –

+0

읽었습니까? http : //www.sommarskog.se/dynamic_sql.html#List – Meff

답변

3

다음은 쿼리의 개선 다시 쓰기 (이것은 단지 조인, 별칭을 수정 및 크기없이 nvarchar가)입니다. 서식을 지정한 후에 작업 버전을 인쇄하면 도움이됩니다.

가장 좋은 추측은 @ FirmIDString`에는 쉼표와 ID 사이의 공백이 있습니다. 그렇다면이 작동합니다.

WHERE CHARINDEX(', ' + CAST(firmID as varchar(30)) + ', ', ', ' + @FirmIDString + ', ') > 0 
+0

쿼리 (비 저장 프로 시저)에서 response.write를 실행했으며, 'EXEC ps_selectHireResponseSQL'76 ', 659 '때문에 1 개의 숫자가 있더라도 여전히 작동하지 않습니다 ... 여러 개의 숫자가있을 때'EXEC ps_selectHireResponseSQL '47, 140,138,137,139 ', 594' – omega

+0

@omega로 포맷됩니다. . . 이 경우 원본 쿼리가 행을 반환하는지 확인하십시오? 그렇다면 작동하는 쿼리의 인쇄물로 질문을 편집 할 수 있습니까? –

+0

@omega. . . 나는 아이디어가. @FirmId를 저장 프로 시저의 인수로 선언하면'varchar' 또는'varchar ()'를 사용합니까? 길이가 없으면 기본값은 1이며 모든 것이 잘립니다. –

관련 문제