Sql-Server
用外部表讀取小數點逗號
SQL Server 2016、SQL Server 管理工作室 (SSMS)。使用 Transact-SQL 和 Polybase 創建外部表。我們如何閱讀帶有小數點的小數,逗號而不是點?
使用
float
anddecimal
時,它會失敗並引發錯誤。使用money
數據類型時,它會成功,但會返回誤讀的小數和整數。修改了文件格式標準條款,沒有配置這種東西的選項。已經為我的區域設置了排序規則。
樣本數據:
2017;4;2017;601PPP;183,63;0 2017;4;2017;601PPP;183,63;0 2017;4;2017;601PPP;183,63;1.000,55 2017;4;2017;601PPP;183,63;2,5 2017;4;2017;601PPP;183,63;7,5 2017;4;2017;601PPP;405,28;17,5
無法讀取範例數據的創建表範例:
CREATE EXTERNAL TABLE [dbo].[STG_Table] ( field1 smallint NULL ,field2 tinyint NULL ,field3 smallint NULL ,fieldn_2 varchar(10) NULL ,fieldn_1 money NULL ,fieldn float NULL ) WITH (LOCATION='/STG_Table/', DATA_SOURCE = AzureDataSource, FILE_FORMAT = FileFormat );
用於讀取數據的查詢:
SET @dynamicSQL = N'SELECT * INTO ##' + @someTable + ' FROM STG_' + @someTable EXEC sp_executesql @dynamicSQL
指定欄位意味著要添加更多案例(在過程中工作),並且可以通過配置這樣的事情來避免。我發現配置它比添加更多程式碼更簡單。在數據庫配置中找不到配置。
似乎將 ‘1.000,55’ 解釋為浮點數並不簡單,但作為數字是可能的。從那個答案
select try_parse('1.000,55' as numeric(10,2) using 'es-ES') as x x ------- 1000.55
我已經嘗試過使用其他目標數據類型的所有方法。沒有工作。顯然,可以將 CAST() 包裹在 try_parse 周圍以獲得所需的最終類型。
因此,我建議您將具有困難列的外部表定義為 varchar(n)。然後定義一個視圖,它讀取外部表並使用 try_parse 將困難的列轉換為所需的數據類型。該視圖可供應用程序和最終使用者訪問;該表僅對視圖可見。