2008-11-20 6 views
5

Existe-t-il un moyen d'interroger le DATEFOMRAT actuel SQLServer 2005 utilise actuellement T-SQL?Définition et réinitialisation de DATEFORMAT dans SQLServer 2005

J'ai une application qui lit les instructions INSERT pré-générées et les exécute sur une base de données. Pour rendre indépendantes les données à insérer, je stocke les valeurs de datetime représentées dans la culture invariante (mois/jour/année ...). Le serveur de base de données peut s'exécuter avec des paramètres régionaux différents, en fonction des paramètres régionaux du système (en utilisant peut-être jour/mois/année), de sorte que l'insertion peut échouer car le datetime ne peut pas être analysé.

Je sais qu'il existe les instructions "SET LANGUAGE" et "SET DATEFORMAT" dans T-SQL pour définir les paramètres régionaux à utiliser.
Je ne veux pas rendre ces changements permanents (sont-ils permanents?), Donc je cherche un moyen de lire le DATEFORMAT de la base de données, le stocker, changer le format à mon goût et le réinitialiser à la valeur stockée après que les données ont été insérées.

Des idées où trouver cette valeur dans le serveur?

Répondre

5

Définir la langue et définir DateFormat affecte uniquement la session en cours. Si vous vous déconnectez de la base de données et que vous vous reconnectez, la langue et le format de date sont réinitialisés à leurs valeurs par défaut.

Il existe une astuce que vous pouvez utiliser pour déterminer si DateFormat est m/d/y ou d/m/y.

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

Cette date est valide dans les deux cas. C'est le 2 janvier ou le 1er février. Si cette requête renvoie un 1, alors vous avez MDY. Si elle renvoie un 2, vous avez DMY.

+0

Merci! On dirait que je m'inquiétais un peu trop :) – lowglider

1

Si elle est pas trop tard soumettre vos dates AAAAMMJJ à SQL Server et ils seront toujours inséré correctement quel que soit DMY ou MDY paramètres dateformat

SET DATEFORMAT est pas permanente. Dans mon expérience, cela affecte cette connexion particulière. Certaines personnes disent session seulement mais j'ai trouvé que si la connexion est retournée au pool et réutilisée avant qu'elle ne soit perdue, elle conserve le paramètre de format de date défini par un utilisateur précédent. Qu'en est-il de la colonne format_date de sys.dm_exec_sessions?

4

Vous pouvez toujours consulter votre propre session donc pas droit au niveau du serveur seraient nécessaires

6

La déclaration suivante effectuera une opération d'analyse syntaxique date en utilisant un format de date donnée (la variable @dateFormat), puis re activer la date d'origine format.

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; 

Notez que les modifications de format de date s'appliquent uniquement à la connexion en cours. La réactivation du format de date d'origine est uniquement effectuée pour garantir que les instructions ultérieures exécutées sur la même connexion ne sont pas affectées par cette modification.

1

J'ai trouvé un moyen d'obtenir ceci dans une table d'options d'utilisateur ailleurs, et l'ai converti pour obtenir juste le format de date. Il peut être utile à d'autres (notez qu'ils sont divers autres paramètres dans la même table afin que vous puissiez vérifier si ansi_nulls sont définies et diverses autres choses de la même manière):

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