2009-09-14 6 views
2

Je suis en train de copier les résultats d'une vue à une table en utilisant:SQL Server: "La conversion a échoué lors de la conversion de datetime à partir d'une chaîne de caractères."

insert into tableA 
    select * from viewB order by id; 

je reçois le message d'erreur -

Msg 241, Level 16, State 1, Line 1 
Conversion failed when converting datetime from character string. 

TableA et viewB ont environ 80 champs. Essayer de déterminer lequel pourrait avoir une incompatibilité de type prendra une éternité. Comment puis-je déterminer quelle colonne provoque l'erreur rapidement?

+1

Combien de colonnes datetime y a-t-il dans tableA? jetez un oeil à ceux – Scoregraphic

+0

oui, d'accord - ce genre de message "quelque chose s'est mal passé" sont assez inutile ..... me demandais pourquoi l'équipe SQL Server n'arrive pas à nous dire au moins ** QUOI ** La colonne a provoqué l'échec de cette conversion ... –

Répondre

2

Cela vous donne une liste de toutes les colonnes de votre TableA qui ont un type (DATE, DATETIME, DATETIME2, Datetimeoffset etc.) se rapportant aux dates:

SELECT * 
FROM sys.columns 
WHERE object_id = object_id('TableA') 
AND system_type_id IN (40, 42, 43, 58, 61) 
ORDER BY name 

Vous pouvez exécuter sur les deux tables et voyez si vous trouvez des divergences.

Ou vous pouvez exécuter sur les deux tables - il vous donnera une liste de colonnes (noms) et leurs associés datatype:

SELECT 
    c.NAME, 
    t.name 
FROM sys.columns c 
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id 
WHERE object_id = object_id('TableA') 
ORDER BY c.name 

Peut-être que vous verrez une colonne TableB qui est de type VARCHAR qui est étant mappé à une colonne de type DATETIME dans TableA et puis trouver votre coupable de cette façon.

Marc

+0

En utilisant la méthode du haut, je l'ai limitée à environ 20 colonnes. Je l'ai finalement trouvé. On dirait que vous pourriez probablement réécrire la méthode du bas afin qu'il produise les champs de la vue et de la table l'un à côté de l'autre. – wkstar

+0

Votre deuxième requête pourrait être remplacée par 'EXEC sp_columns 'TableA'' et vous obtiendrez la description complète de la colonne. – Scoregraphic

+0

oui, mais alors vous avez affaire à une sortie proc stockée - pas une belle table que vous pouvez sélectionner des champs supplémentaires, l'ordre, et ainsi de suite. Je préfère la vue du catalogue système sur ces processus stockés intégrés –

1

Ce sont principalement des champs DATETIME? On dirait qu'il essaie de faire passer une chaîne dans un DATETIME afin que vous puissiez commencer en regardant les premiers de ceux-ci.

Ne devrait pas prendre trop de temps.

0

En tant que fonctionnalité de débogage, vous pouvez effectuer la requête de sélection à partir de la vue, puis les enfoncer dans un seul insert dans la tableA.

Ensuite, il va lancer une erreur contenant la colonne qui n'a pas pu être insérée. En supposant que vous pouvez le faire manuellement. A part cela, y a-t-il un moyen d'éviter d'avoir une chaîne comme colonne de date/heure?

2

Vous avez de mauvaises données dans l'un de vos champs. Vérifiez chacun des champs qui doivent contenir des dates avec la fonction isdate().

Select idfield, mydatefield from mytable where isdate(mydatefield) = 0 

Vous verrez les enregistrements contenant des dates non valides. C'est une des raisons pour lesquelles ce n'est jamais une bonne idée de stocker des dates sous forme de données de chaîne.

Questions connexes