Это не то, как вы делаете что-то на Java. В Java нет динамических переменных. Переменные Java должны быть объявлены в исходном коде (*). Период.
В зависимости от того, чего вы пытаетесь достичь, вы должны использовать массив, List
или Map
; например,
int n[] = new int[3];
for (int i = 0; i < 3; i++) {
n[i] = 5;
}
List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
n.add(5);
}
Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
n.put("n" + i, 5);
}
Можно использовать динамическое отражение для обозначения переменных , которые были объявлены в исходном коде. Однако это работает только для переменных, являющихся членами класса (т. Е. Статических полей и полей экземпляра). Он не работает для локальных переменных. См. Пример «быстрый и грязный» @ fyr.
Однако делать это без необходимости в Java - это плохая идея. Это неэффективно, код более сложный, и поскольку вы полагаетесь на проверку времени выполнения, он более хрупкий.
И это не «переменные с динамическими именами». Он лучше описывает динамический доступ к переменным со статическими именами.
* - Это утверждение немного неточно. Если вы используете BCEL или ASM, вы можете «объявить» переменные в файле байт-кода. Но не делай этого! Таким образом, безумие!
DECLARE @xml VARCHAR(8000) = '<root><que trp=''100001'' ccid=''59748'' /></root>'
DECLARE @recordXml XML = @xml
SELECT
dat.trip_no
, MAX( dat.check_call_id ) AS max_check_call_id
FROM (
SELECT
T.a.value( '@trp[1]','CHAR(6)' ) AS trip_no,
T.a.value( '@ccid[1]','INT' ) AS check_call_id
FROM @recordXml.nodes( '/root/que' ) T( a )
WHERE
LEN( T.a.value('@trp[1]','CHAR(6)') ) = 6
AND ISNUMERIC( T.a.value( '@trp[1]','CHAR(6)' ) ) = 1
AND CONVERT( INT, T.a.value( '@trp[1]','CHAR(6)' ) ) > 0
) AS dat
GROUP BY
dat.trip_no
Использовать подзапрос ...
SELECT
trip_no,
MAX(check_call_id) AS check_call_id
FROM
(
SELECT
T.a.value('@trp[1]' , 'CHAR(6)') AS trip_no,
T.a.value('@ccid[1]', 'INT' ) AS check_call_id
FROM
@recordXml.nodes('/root/que')T(a)
WHERE
LEN(T.a.value('@trp[1]','CHAR(6)')) = 6
AND ISNUMERIC(T.a.value('@trp[1]','CHAR(6)')) = 1
AND CONVERT(INT, T.a.value('@trp[1]','CHAR(6)')) > 0
)
AS parsed_xml
GROUP BY
trip_no