Это - что-то, что раздражает меня о MSSQL ( напыщенная речь на моем блоге ). Мне жаль, что MSSQL не поддерживал upsert
.
@Dillie-O's код является хорошим путем в более старых версиях SQL (+1 голосование), но это все еще - в основном две операции IO (exists
и затем update
или insert
)
существует немного лучший путь на это сообщение в основном:
--try an update
update tablename
set field1 = 'new value',
field2 = 'different value',
...
where idfield = 7
--insert if failed
if @@rowcount = 0 and @@error = 0
insert into tablename
( idfield, field1, field2, ... )
values ( 7, 'value one', 'another value', ... )
Это уменьшает его до операций IO, если это - обновление, или два если вставка.
мс Sql2008 представляет merge
из стандарта SQL:2003:
merge tablename as target
using (values ('new value', 'different value'))
as source (field1, field2)
on target.idfield = 7
when matched then
update
set field1 = source.field1,
field2 = source.field2,
...
when not matched then
insert ( idfield, field1, field2, ... )
values ( 7, source.field1, source.field2, ... )
Теперь это - действительно всего одна операция IO, но ужасный код:-(
split ()
принимает регулярное выражение (см. split (java.lang.String) ), а не строку-разделитель для разделения. Регулярное выражение «.»
означает «любой одиночный символ» (см. regex ), поэтому оно будет разделено на все, что ничего не останется в вашем списке. Чтобы разделить на буквальную точку, используйте:
file.getName().split("\\.")// \. escapes . in regex \\ escapes \ in Java.String
В общем, вы можете использовать Pattern.quote (str)
, чтобы получить регулярное выражение, которое буквально соответствует str
. (предложено ramon )
file.getName().split(Pattern.quote("."))
Возможно, вам стоит перечитать api-doc для split (java.lang.String)
Строка, которую вы передать это регулярное выражение .
Попробуйте использовать
split("\\.")
. Вам нужна двойная обратная косая черта, потому что \.
является недопустимым escape-символом в строке Java. Таким образом, вам нужно избежать самой обратной косой черты в строке javastring.
String.split ()
запрашивает регулярное выражение в своем параметре, а в регулярных выражениях - .
будет соответствовать любому персонажу. Чтобы заставить его работать, вам нужно добавить \
, например:
System.out.println(file.getName().split("\\.").length);
Вам понадобится одна обратная косая черта, чтобы избежать точки, чтобы регулярное выражение знало, что вам нужна настоящая точка. Вам понадобится другая обратная косая черта, чтобы избежать первой обратной косой черты, т.е. чтобы сообщить Java, что вы хотите, чтобы внутри вашей строки была фактическая обратная косая черта.
Прочтите javadoc для String.split и регулярных выражений ] для получения дополнительной информации.