2008-11-20 3 views
5

Есть ли способ запросить текущий DATEFOMRAT SQLServer 2005 в настоящее время используется с T-SQL?Установка и сброс DATEFORMAT в SQLServer 2005

У меня есть приложение, которое считывает предварительно сгенерированные инструкции INSERT и выполняет их в отношении базы данных. Чтобы данные были вставлены независимо от культуры, я сохраняю значения даты и времени, представленные в культуре инвариантов (месяц/день/год ...). Сервер базы данных может работать в разных местах, в зависимости от локали системы (возможно, используя день/месяц/год), поэтому вставка может произойти сбой, потому что время datetime не может быть проанализировано.

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

Любые идеи, где найти это значение на сервере?

ответ

5

Set Language и Set DateFormat влияют только на текущий сеанс. Если вы отключитесь от базы данных и снова подключитесь, язык и Dateformat вернутся к значениям по умолчанию.

Существует «трюк», который вы можете использовать, чтобы определить, является ли DateFormat m/d/y, или d/m/y.

Select DatePart(Month, '1/2/2000') 

Эта дата действительна в любом случае. Это 2 января или 1 февраля. Если этот запрос возвращает 1, значит, у вас есть MDY. Если он возвращает 2, у вас есть DMY.

+0

Спасибо! Похоже, я слишком переживал :) – lowglider 2008-11-21 09:45:35

1

Если это не слишком поздно, введите даты ГГГГММДДА к SQL Server, и они всегда будут вставлены правильно, независимо от настроек DateFormat ДМГА или MDY

SET DATEFORMAT также не является постоянным. По моему опыту это влияет на конкретную связь. Некоторые люди говорят только сеанс, но я обнаружил, что соединение возвращается в пул и повторно используется до того, как оно будет потеряно, тогда оно сохранит параметр dateformat, установленный предыдущим пользователем.

4

Как насчет столбца формата даты_ в sys.dm_ exec_sessions?

Вы всегда можете просмотреть свой собственный сеанс, так что никаких прав на уровне сервера не будут необходимы

6

Следующий оператор выполнит операцию дата синтаксического анализа с использованием заданного формата даты (переменная @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; 

Обратите внимание, что изменения формата даты применяются только к текущему соединению. Повторное включение исходного формата даты выполняется только для того, чтобы это изменение не повлияло на последующие операторы, выполняемые в одном и том же соединении.

1

Я нашел способ получить это в таблице параметров пользователя в другом месте и преобразовать его, чтобы получить только формат даты. Это может быть полезно для других (обратите внимание, что они представляют собой различные другие настройки в одной таблице, чтобы вы могли проверить, установлены ли 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