2017-10-11 2 views
1

먼저 코드를 작성하십시오.Coldfusion : cfqueryparam을 포함하는 동적 쿼리 실행

Error Executing Database Query. 
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near '<'. 

그것은이 보인다 :하지만 오류를 얻고있다

<cfquery name="qName" datasource="#dsn#"> 
    #myQueryStruct[arguments.type]# 
</cfquery> 

을 : 나는 아래와 같이 동적으로 쿼리를 실행해야

<cfset myQueryStruct = { 
qone = "select * from t1 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>", 
qtwo = "select * from t2 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>" 
}> 

: 나는 쿼리의 구조체를 만들고 있어요 오류가 "<cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>"검색어 ("<")와 관련이 있습니다.

시도해 보았습니다. evaluate()를 사용하여이 오류 얻고있다 :, 수 나는 우리가 <cfquery>하지만 내 질문은 내부 <cfif> 사다리를 사용하여이 작업을 수행 할 수 있습니다 알고

Invalid CFML construct found on line 1 at column 15. 
ColdFusion was looking at the following text: 

t1 

을 우리는 내가를 언급하는 방식 (내가 모르는 뭔가가 있어야합니다)처럼 이렇게 또는 CFML에서 가능하지 않습니까?

+0

'cfqueryparam'의'cfscript' 버전을 살펴볼 수 있습니다. 확실히 말할 수는 없지만 시도하려는 내용에 적용되는 것처럼 보입니다. https://cfdocs.org/cfqueryparam – snackboy

+2

CFQUERYPARAM을 사용하는 것은 칭찬 할만한 일이지만 동적 쿼리와 함께 사용하는 것은 어렵습니다. 해결 방법은 아래 Andreas 응답을 참조하십시오. 한편, cfquery 태그 사이에 코드를 출력하는 것을 고려하십시오. 이것이 cfquery가 디자인 한 것이며 실제로 스크립트에 태그를 선호하는 장소 중 하나입니다. SQL 관리자에서 복사하고 바인딩을 추가하기가 쉽습니다. –

답변

6

문제는 ColdFusion에서 처리해야하는 태그가있는 문자열을 전달한다는 것입니다. 하지만 너무 늦었 어. CF는 이미 템플릿을 파싱 했으므로 문자열은 번역되지 않은 상태로 남아 있으므로 SQL 오류가 발생합니다.

I 해요 확실하지, 당신이 여기 달성하고 싶은 정확히,이 코드처럼 어쩌면 뭔가 작동합니다 :

<cfscript> 
dsn = "myDatabase"; 
criteria = "something"; 
myQueryStruct = { 
    qone = "select * from t1 where column = (:a1) ", 
    qtwo = "select * from t2 where column = (:a1) " 
}; 

result1 = getQueryResult(queryString = myQueryStruct[ "qone" ], filterValue = criteria, dsn = dsn); 
result2 = getQueryResult(queryString = myQueryStruct[ "qtwo" ], filterValue = criteria, dsn = dsn); 

public function getQueryResult(queryString, filterValue, dsn){ 
    var qry = new Query(); 
    var qryString = arguments.queryString; 
    var queryResult = ""; 
    qry.setDatasource(arguments.dsn); 
    qry.setSQl(qryString); 
    qry.addParam(name="a1", value= arguments.filterValue, cfsqltype="cf_sql_varchar"); 
    queryResult = qry.execute().getResult(); 
    return queryResult; 
} 
</cfscript> 
+0

감사합니다, Andreas. CFML 태그를 사용하여 이것이 가능하다고 생각하십니까? – Binod

+0

@Binod 왜 스크립트가 아닌가요? – Shawn

+0

프로젝트가 스크립트를 사용하고 있지 않습니다. 그래서 이유가 있습니다. 나는 CF 에코 시스템에 익숙하지 않다. 태그와 스크립트의 2 가지 변형에 대해 어떻게 생각 하는가? 각각에는 그것의 자신의 이점이 있습니까? – Binod

0

먼저 데이터의 arguments.a1와 종류를 설정의 cfparam 사용할 수 있으며, 그런 다음 쿼리 내에서 '# arguments.a1 #'변수를 참조하십시오. 문제를 일으키는 cfqueryparam 태그가 무엇인지 알아내는 데 도움이됩니다.