2014-09-23 42 views
0

首先,視圖中的CAST(COLUMN_NAME爲CHAR(XX))和TO CHAR(COLUMN_NAME)之間的區別是什麼?Oracle 10g:CAST到數據類型CHAR會導致領先的空白?

我遇到的問題是我們正處於Oracle到SQL Server的轉換過程中,並且數據類型轉換對我們表的列是必需的。所以,我提出用投功能像這樣一個觀點:

CREATE OR REPLACE VIEW ARS_DMIS AS 
SELECT 
CAST (DMIS_TBL_ID AS CHAR(15)) "DMIS_TBL_ID", 
CAST (PARENT_DMIS_CODE AS CHAR(4)) "PARENT_DMIS_CODE", 
CAST (CHILD_DMIS_CODE AS CHAR(4)) "CHILD_DMIS_CODE", 
CAST (SERVICE AS CHAR(15)) "SERVICE", 
CAST (TYPE_FACILITY AS CHAR(10)) "TYPE_FACILITY", 
CAST (UNIT_ORGANIZATION AS CHAR(60)) "UNIT_ORGANIZATION", 
CAST (SITE AS CHAR(60)) "SITE", 
CAST (LOCATION AS CHAR(60)) "LOCATION", 
CAST (CITY AS CHAR(30)) "CITY", 
CAST (STATE AS CHAR(2)) "STATE", 
CAST (ZIP AS CHAR(10)) "ZIP", 
CAST (DODAAC AS CHAR(10)) "DODAAC", 
CAST (REGION AS CHAR(10)) "REGION", 
CAST (CONUS AS CHAR(3)) "CONUS", 
CAST (POC AS CHAR(30)) "POC", 
CAST (POC_PHONE_NUMBER AS CHAR(20)) "POC_PHONE_NUMBER", 
TO_CHAR (LAST_DATE, 'MM/DD/YYYY HH24:MI:SS') "LAST DATE", 
CAST (LAST_USER AS CHAR(32)) "LAST_USER", 
CAST (EMAIL AS CHAR(255)) "EMAIL", 
CAST (INVENTORY_SITE AS CHAR(11)) "INVENTORY_SITE", 
CAST (INVENTORY_REGION_ID AS CHAR(15)) "INVENTORY_REGION_ID", 
CAST (ROWID AS CHAR(20)) "ROWID" 
FROM ASSET_MGT.DMIS_TBL; 

我用「TO_CHAR」唯一的實例是上的日期,因爲我需要更改日期也和鑄造的格式將不允許這樣做。

我將其餘的列轉換爲遷移到SQL Server的適當數據類型,並指定字符長度以匹配表中列的原始字符長度。但是我現在才發現,這樣做會導致空格一直跟蹤到指定的字符長度。我該如何防止這種情況發生?我知道我可以在視圖查詢內修剪它:

SELECT TRIM (TRAILING FROM DMIS_TBL_ID) "DMIS_TBL_ID" from ARS_DMIS_TBL 

我不想走這條路,因爲這樣做對於所有的列將是耗時的。我起訴的演員功能錯了嗎?什麼是防止這些空白填充的最有效方法?

回答

2

CHAR(xx)是固定寬度的數據類型。根據定義,它必須用空格填充到指定的長度。

VARCHAR2(xx)是一個可變寬度數據類型。根據你的描述,看起來你確實想要cast你的專欄到VARCHAR2(xx)而不是CHAR(xx)

這就是說,將表中的所有列轉換爲字符串作爲轉換的一部分似乎很不尋常。當然,目標SQL Server數據庫將使用datedatetime列來存儲日期,它將使用數字數據類型來存儲數字等。

+0

好吧,雖然SQL Server是後端數據庫,但前端BMC Remedy需要這些具體的數據類型被拉入查看窗體..有趣的是,所有被轉換爲CHAR的列主要是VARCHAR2,因爲他們說他們不能接受VARCHAR2作爲數據類型。lol – emvee 2014-09-23 19:29:45

+0

@emvee - 如果目標數據類型是'CHAR',那麼根據定義,空格填充是必需的。如果你想避免空格填充,你需要使用寬度可變的數據類型。 – 2014-09-23 19:37:07

相關問題