Есть ли способ запросить текущий DATEFORMAT SQLServer 2005, который в настоящее время используется с T-SQL?
У меня есть приложение, которое читает предварительно сгенерированные операторы INSERT и выполняет их в базе данных. Чтобы данные для вставки не зависели от культуры, я сохраняю значения типа datetime, представленные в инвариантной культуре (месяц / день / год ...). Сервер базы данных может работать с разными языковыми стандартами, в зависимости от языкового стандарта системы (возможно, с использованием дня / месяца / года), поэтому при вставке может произойти сбой из-за невозможности синтаксического анализа даты и времени.
Я знаю, что в T-SQL есть операторы «SET LANGUAGE» и «SET DATEFORMAT» для установки используемой локали. Я не хочу делать эти изменения постоянными (являются ли они постоянными?), Поэтому я ищу способ прочитать DATEFORMAT из БД, сохранить его, изменить формат по своему вкусу и сбросить его до сохраненного значения после данные были вставлены.
Есть идеи, где найти это значение на сервере?


«Установить язык» и «Установить формат даты» влияют только на текущий сеанс. Если вы отключитесь от базы данных и подключитесь снова, язык и формат даты вернутся к значениям по умолчанию.
Есть «трюк», который можно использовать, чтобы определить, является ли DateFormat m / d / y или d / m / y.
Select DatePart(Month, '1/2/2000')
Эта дата действительна в любом случае. Это 2 января или 1 февраля. Если этот запрос возвращает 1, значит, у вас MDY. Если он возвращает 2, у вас есть ДМИ.
Если еще не поздно, отправьте свои даты как ГГГГММДД в SQL Server, и они всегда будут вставлены правильно, независимо от настроек формата даты DMY или MDY.
SET DATEFORMAT также не является постоянным. По моему опыту, это влияет именно на эту связь. Некоторые люди говорят только сеанс, но я обнаружил, что если соединение возвращается в пул и повторно используется до его потери, оно сохраняет настройку формата даты, установленную предыдущим пользователем.
А как насчет столбца формата date_ в sys.dm_ exec_sessions?
Вы всегда можете просмотреть свой сеанс, поэтому права на уровне сервера не требуются.
Следующий оператор выполнит операцию синтаксического анализа даты с использованием заданного формата даты (переменная @dateFormat), а затем снова включит исходный формат даты.
declare @dateFormat nvarchar(3);
set @dateFormat = 'dmy';
declare @originalDateFormat nvarchar(3);
select @originalDateFormat = date_format from sys.dm_exec_sessions where session_id = @@spid;
set dateformat @dateFormat;
--Returns 1.
select isdate('31/12/2010');
set dateformat @originalDateFormat;
Обратите внимание, что изменения формата даты применяются только к текущему соединению. Повторное включение исходного формата даты выполняется только для гарантии того, что это изменение не повлияет на последующие операторы, выполняемые в том же соединении.
Я нашел способ получить это в таблице пользовательских параметров в другом месте и преобразовал его, чтобы получить только формат даты. Это может быть полезно другим (обратите внимание, что в той же таблице есть различные другие настройки, чтобы вы могли точно так же проверить, установлены ли ansi_nulls и другие другие вещи):
create table #temp (SetOption nvarchar(50),Val nvarchar(50))
insert into #temp
exec sp_executesql N'dbcc useroptions'
select val from #temp where setoption='dateformat'
drop table #temp