Sql-Server

用外部表讀取小數點逗號

  • August 23, 2021

SQL Server 2016、SQL Server 管理工作室 (SSMS)。使用 Transact-SQL 和 Polybase 創建外部表。我們如何閱讀帶有小數點的小數,逗號而不是點?

使用floatanddecimal時,它會失敗並引發錯誤。使用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 將困難的列轉換為所需的數據類型。該視圖可供應用程序和最終使用者訪問;該表僅對視圖可見。

引用自:https://dba.stackexchange.com/questions/195329