J'utilise openrowset pour importer un fichier csv dans SQL Server. L'une des colonnes du fichier csv contient des nombres en notation scientifique (1.08E + 05) et la colonne du tableau en cours d'insertionConvertir la notation scientifique en flottant lors de l'utilisation de OpenRowSet pour importer un fichier .CSV
Par défaut, il importe la valeur 1 et ignore le .08E + 05.
J'ai essayé d'utiliser cast() et convert() pour convertir la valeur directement lors de l'exécution de la requête, ainsi que pour configurer le type de données dans la table sous forme de chaîne de caractères et l'importer comme tel. Toutes ces méthodes ont le même comportement où le .08E + 05 est ignoré.
Y at-il un moyen d'avoir la valeur importée comme 108000 au lieu de 1 sans le .08E + 05 sans avoir à changer le fichier csv lui-même?
Configuration du type de données en tant que varchar et la lecture dans le fichier csv semble avoir le même effet avec le code suivant:
CREATE TABLE #dataTemp (StartDate datetime, Value varchar(12))
SET @insertDataQuery = 'SELECT Date, CSVValue from OpenRowset(''MSDASQL'', ''Driver={Microsoft Text Driver (*.txt; *.csv)}; DefaultDir='
SET @insertDataQuery = @insertDataQuery + 'C:\Data\;'',''SELECT * FROM '+ '11091800.csv' + ''')'
INSERT INTO #dataTemp EXEC(@insertDataQuery)
SELECT * FROM #dataTemp
pas toutes les valeurs dans le fichier CSV ont la notation scientifique et la valeur sans elle, par exemple 81000 traverser sans problème.
En fait, dans votre cas, maintenant que je suis en train de relire la question que vous pouvez probablement utiliser 'SELECT CONVERT (INT , CONVERT (FLOAT, '1.08E + 05 ')); - la dernière fois que j'ai travaillé sur la notation scientifique, j'avais affaire à des compteurs de performance de LogMan, et j'avais absolument besoin des décimales ... –
Toutes les solutions ci-dessus fonctionnent si je fournis la valeur explicitement. Dans le fichier CSV, j'ai un nom de colonne pour la valeur et si je l'utilise, par exemple CONVERT (INT, CONVERT (FLOAT, COLUMN_NAME_IN_CSV)) je reçois toujours le comportement où il lit seulement le premier chiffre. Pensées? – amarcy
Mes pensées sont encore à insérer en vrac dans une table de varchars en premier. Il peut se passer quelque chose d'autre lorsque votre requête insert ... select from openrowset essaie de faire correspondre les types de tables aux métadonnées de la requête. Si vous insérez d'abord dans varchar, cela ne vous dérangera pas ... –