Это как раз то, что я придумал, чтобы решить проблему ... Я почти уверен, что это решает проблему, с которой столкнулся оригинальный аскер:
Array.prototype.each = function(callback){
if(!callback) return false;
for(var i=0; i<this.length; i++){
if(callback(this[i], i) == false) break;
}
};
И тогда вы бы назвали это, используя :
var myarray = [1,2,3];
myarray.each(function(item, index){
// do something with the item
// if(item != somecondition) return false;
});
Возвращение false внутри функции обратного вызова приведет к прерыванию. Дайте мне знать, если это не сработает.
Вы можете использовать SET LANGUAGE , чтобы выбрать формат даты, который SQL Server ожидает в запросах (я думаю, что студия управления использует региональные настройки клиентского компьютера для отображения цели, хотя не уверен). Однако я предлагаю передавать значения с использованием параметров вместо того, чтобы встраивать их в оператор запроса. Если вы используете параметры, у вас не возникнет никаких проблем. Обо всем позаботились.
set language us_english
declare @d datetime = '1929/12/18'
set language british
declare @d datetime = '1929/12/18' -- fails
Чтобы изменить язык сервера по умолчанию:
declare @langid int = (select langid from syslanguages where name = 'british')
exec sp_configure 'default language', @langid
reconfigure with override
Поскольку перечисления являются целыми числами, вы можете заключить перечисление в NSNumber. Когда вы добавляете / получаете что-то на / с карты, вы передаете перечисление в конструктор NSNumber ...
Предполагая, что вы '
[Изменить: я просто говорю о том, что я вложил в свои сценарии SQL для обеспечения совместимости независимо от настроек сервера, а не о том, что SQL Server «отображает»]
Прежде всего, давайте обсудим, что такое «прямая ссылка» и почему она плохая. Прямая ссылка - это ссылка на переменную, которая еще не была инициализирована, и она не ограничивается только статическими инициализаторами. Это плохо просто потому, что, если они позволят, они дадут нам неожиданные результаты. Взгляните на этот фрагмент кода:
public class ForwardRef {
int a = b; // <--- Illegal forward reference
int b = 10;
}
Что должно быть j при инициализации этого класса? Когда класс инициализируется, инициализации выполняются в порядке от первого до последнего встреченного. Следовательно, вы ожидаете, что строка
a = b;
будет выполняться до:
b = 10;
Чтобы избежать такого рода проблем, разработчики Java полностью запретили такое использование прямых ссылок.
РЕДАКТИРОВАТЬ
это поведение определяется разделом 8.3.2.3 Спецификаций языка Java :
Вы можете установить значение по умолчанию язык для каждого отдельного входа в SQL Server . Не могу вспомнить, но что-то вроде этого:
sp_defaultlanguage @loginame = 'LoginName', @language = 'Language'
Почти во всех случаях правильный способ решить эту проблему - просто никогда не рассматривать дату как строку. Если вы передаете параметр или используете (типизированное) значение столбца, то преобразование текста сервера просто не имеет значения. Это не только позволяет избежать проблемы с i18n, но и снижает поверхность для атаки путем инъекции. И это также экономит несколько циклов ЦП ;-p
Если вы используете EXEC
для динамического SQL, то это также следует параметризовать с помощью sp_ExecuteSQL
.
Я стараюсь использовать каноническую форму ODBC для даты везде, где это возможно {д 'гггг-мм-дд'} Таким образом, я знаю, как sql server будет интерпретировать это. Он отлично работает в TSQL.