The following example returns the ODBC data types of each of the query arguments (?, :var, and constants) in order. Note that the TOP argument is returned as data type 12 (VARCHAR) rather than 4 (INTEGER) because it is possible to specify TOP ALL:
set myquery = 4
set myquery(1) = "SELECT TOP ? Name,DOB,Age+10 "
set myquery(2) = "FROM Sample.Person"
set myquery(3) = "WHERE %ID BETWEEN :startid :endid AND DOB=?"
set myquery(4) = "ORDER BY $PIECE(Name,',',?)"
set tStatement = ##class(%SQL.Statement).%New()
set qStatus = tStatement.%Prepare(.myquery)
if qStatus'=1 {write "%Prepare failed:" do $System.Status.DisplayError(qStatus) quit}
set prepmeta = tStatement.%Metadata
write "Number of ? parameters=",prepmeta.parameterCount,!
set formalobj = prepmeta.formalParameters
set i=1
while formalobj.GetAt(i) {
set prop=formalobj.GetAt(i)
write prop.colName," type= ",prop.ODBCType,!
set i=i+1 }
write "End of metadata"