㈠ sqlserver中datetime怎樣sqlldr載入到oracle
to_date('2008-10-15','YYYY-MM-DD')
OPTIONS (skip=1,rows=128) -- sqlldr 命令顯示的選項可以寫到這里邊來,skip=1 用來跳過數據中的第一行
LOAD DATA
INFILE "users_data.csv" --指定外部數據文件,可以寫多個 INFILE "another_data_file.csv" 指定多個數據文件
--這里還可以使用 BADFILE、DISCARDFILE 來指定壞數據和丟棄數據的文件,
truncate --操作類型,用 truncate table 來清除表中原有記錄
INTO TABLE users -- 要插入記錄的表
Fields terminated by "," -- 數據中每行記錄用 "," 分隔
Optionally enclosed by '"' -- 數據中每個欄位用 '"' 框起,比如欄位中有 "," 分隔符時
trailing nullcols --表的欄位沒有對應的值時允許為空
(
virtual_column FILLER, --這是一個虛擬欄位,用來跳過由 PL/SQL Developer 生成的第一列序號
user_id number, --欄位可以指定類型,否則認為是 CHARACTER 類型, log 文件中有顯示
user_name,
login_times,
last_login DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相當用 to_date
) 看最後一行。
可參考如下;
http://www.cnblogs.com/flish/archive/2010/05/31/1748221.html
㈡ MySQL資料庫必會技能,虛擬列的用法
對於想要將自動生成的數據添加到表中的任何人來說, MySQL 虛擬列 是一個強大、易於使用和高級的功能。
INSERT 生成的列允許您在不使用and UPDATE 子句的情況下將自動生成的數據存儲在表中。 這個有用的特性自 5.7 版 起就已成為 MySQL 的一部分,它代表了在生成數據時觸發器的另一種方法。此外,生成的列可以幫助您更輕松、更高效地查詢。
虛擬列 列類似於普通列,但您不能手動更改其值。這是因為表達式定義了如何根據從同一行的其他列中讀取的其他值來生成生成列的值。因此,生成的列在表的域內工作,其定義不能涉及 JOIN 語句。
換句話說,您可以將生成的列視為一種視圖,但僅限於列。請注意,生成的列與 SQL 觸發器 不同,您只能在使用 CREATE TABLE or語句時定義它們,語法如下: ALTER TABLE
該 AS (generated_column_expression) 子句指定要添加或更新到表中的列是生成的列。定義 MySQL 將用於計算列值的 generation_expression 表達式,它不能引用另一個生成的列或除當前表的列之外的任何內容。另外,請注意生成表達式只能涉及不可變函數。例如,您不能在生成的列表達式定義中使用返回當前日期的函數,因為它是一個可變函數。
您還可以在關鍵字前面 AS 加上 GENERATED ALWAYS 關鍵字以使生成的列的性質更加明確,但這是可選的。然後,您可以指示生成列的類型是 VIRTUAL 還是 STORED 。您將在下面的章節中了解這兩種類型之間的區別。默認情況下,如果沒有在查詢中明確指定,MySQL 會將生成的列標記為 VIRTUAL .
現在讓我們看看生成的列語法在 CREATE TABLE 查詢中的作用:
在此示例中,該 full_name 列將自動存儲 first_name 和 last_name 列的連接。
如前所述,您可以將生成的列定義為 VIRTUAL 或 STORED。現在讓我們仔細看看這兩種類型。
MySQL 不存儲標記為 VIRTUAL 的 虛擬列 。這意味著 MySQL 在需要時動態評估其值。 BEFORE 這通常在觸發任何查詢後立即發生。換句話說,虛擬生成的列不佔用存儲空間。
MySQL 存儲任何生成的標記為 STORED 的列。這意味著每次插入或更新行時,MySQL 都會評估其值並將其存儲在磁碟上。換句話說,存儲列需要存儲空間,就好像它是普通列一樣。
現在讓我們進一步了解虛擬列和存儲生成列的優缺點。
優點
缺點
優點
缺點
採用生成的列有幾個原因,但以下三個是最重要的。
如您所見,您可以通過將四列與以下生成的列聚合來輕松生成此數據欄位:
這將產生:
在這種情況下,生成的列使您能夠直接在資料庫級別標准化數據欄位格式。此外,存儲生成的列避免了每次需要時都構造此欄位的不可避免的開銷。
通常,您使用網站 URL 中的資源 ID 或REST API來檢索您需要的數據。但是公開暴露您的 ID 可能會帶來安全問題。當您發現自己使用自動增量 ID 時尤其如此,這很容易預測並使抓取或機器人攻擊更容易。
為避免這種情況,您可以考慮通過使用自動生成的、隨機的、更安全的公共 ID 來隱藏您的原始 ID。您可以通過對您的 ID 進行散列處理,使用虛擬生成的列來實現這一點,如下所示:
請注意,為避免生成已知的哈希值,您可以將您的 ID 與特殊關鍵字連接起來。 在此處了解有關 MySQL 加密和壓縮功能的更多信息。
過濾數據時,有些列比其他列更有用。此外,您通常必須更改存儲在列中的值的表示形式,以使過濾更簡單或更直觀。您可以定義一個有用的生成列來存儲以所需格式執行過濾所需的信息,而不是在每個過濾器查詢中執行此操作。
例如,您可以定義一個生成的列,以便更輕松地找到籃球隊中的球員,如下所示:
這樣的列將產生:
如前所述,您只能在表中使用生成的列。此外,它們只能涉及不可變函數,並且MySQL 生成它們的值以響應 INSERT or UPDATE 查詢。另一方面,觸發器是 MySQL 自動執行的存儲程序,每當與特定表關聯的 或 事件發生 INSERT 時 UPDATE 。 DELETE 換句話說,觸發器可以涉及多個表和所有 MySQL 函數。與生成的列相比,這使它們成為更完整的解決方案。同時,MySQL 觸發器本質上使用和定義更復雜,也比生成的列慢。
㈢ SQL order by 排序問題
可以增加一個虛擬欄位,根據有沒有-號來處理,有-號的,就是1,沒有的就是0。
排序的時候,根據虛擬欄位和正常的排序欄位來排,就可以實現了。類似如下:
select*from
(selectcasewhenCHARINDEX('-',排序欄位名)>0then1else0endasorder_first,*from表名)a
orderbyorder_first,排序欄位名
㈣ oracle sql 虛擬欄位怎麼做條件
substr('Hello World',0,1) //返回結果為 'H'
*從字元串第一個字元開始截取長度為1的字元串
select * from table where substr('欄位a',2,3)='abc'
㈤ SQL查詢插入虛擬表
--少打一個字母
insert into #table(name,price,prices,[datetime])
select name,price,price,datetimes
from cost
where datediff(m,cast(datetimes+'-01' as datetime),getdate())=0
㈥ sql 查詢顯示虛擬列
有點類似於分頁存儲過程裡面的代碼.with tempTable as ( select * , Row_number() over (order by 要排序的欄位名) as rowNumber from 表名 where 1 = 1)select * from tempTable --注意後面的條件查詢 where 1 = 1可不寫也可以進行擴展.
--select * from tempTable 後面可以按虛擬的列標識查詢例如改成select * from tempTable where rowNumber between 1 and 10 是不是要做分頁的效果呢?2000的話會比較麻煩,不過還是可以做的,select top 1 * from table
where 某欄位 not in (select top(分頁的條目) 某欄位 from table)這樣就能達到效果,不過效率不高。。。針對樓主的虛擬列的標識,我寫了個存儲過程,希望對樓主有所幫助吧~是以northwind為實例庫的,有這個資料庫吧select * into ##temp from Categories
go
alter table ##temp add row int
go
create proc row_number
as
begin
declare @id int
set @id=0
while @id < (select count(*) from ##temp)
begin
set @id=@id+1
update ##temp set row=@id where CategoryId=(select top 1 CategoryId from ##temp
where CategoryId not in (select top(@id-1) CategoryId from ##temp))
end
end
go
exec row_number
go
select * from ##temp經測試,可行。。。不過效率不高,個人不推薦使用。。
㈦ 請教SQL LOAD 中的「OPTIONALLY ENCLOSED BY」
1、准備工作:創建需要導入數據的表結構,如果已有相關的表,此步省略!
SQL> create table test
2 (
3 host VARCHAR2(30),
4 user_name VARCHAR2(30),
5 ip_address VARCHAR2(15),
6 pass VARCHAR2(4) default 'no' not null,7 judge NUMBER default 0 not null,8 endtime DATE
9 );
表已創建。
2、編寫sqlload導入數據的控制文件,這里測試的控制文件如下,可以根據自己需要添加相關的控制參數,測試的話復制保存為txt文件即可!
LOAD DATA
INFILE 'd:\data.txt'
INTO TABLE test
TRUNCATE
fields terminated by ','
trailing nullcols
(HOST,USER_NAME,IP_AddrESS,PASS,JUDge,endTIME)控制文件還有其他參數,根據自己需求調整和測試:
附部分控制參數:具體用法以官方文檔為准
OPTIONS (skip=1,rows=128) -- sqlldr 命令顯示的選項可以寫到這里邊來,skip=1 用來跳過數據中的第一行LOAD DATA
INFILE "users_data.csv" --指定外部數據文件,可以是不同格式的數據文件,如csv、txt都支持可以寫多個 INFILE "another_data_file.csv" 指定多個數據文件truncate --操作類型,用 truncate table 來清除表中原有記錄,根據情況而定是否需要清楚原有表中數據INTO TABLE users --要插入記錄的表Fields terminated by "," --數據中每行記錄用 "," 分隔Optionally enclosed by '"' --數據中每個欄位用 '"' 框起,比如欄位中有 "," 分隔符時trailing nullcols --表的欄位沒有對應的值時允許為空(
virtual_column FILLER, --這是一個虛擬欄位,用來跳過由 PL/SQL Developer 生成的第一列序號user_id number, --欄位可以指定類型,否則認為是 CHARACTER 類型, log 文件中有顯示user_name,
login_times,
last_login DATE "-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相當用 to_date() 函數轉換)
insert --為預設方式,在數據裝載開始時要求表為空append --在表中追加新記錄
replace --刪除舊記錄(用 delete from table 語句),替換成新裝載的記錄truncate --刪除舊記錄(用 truncate table 語句),替換成新裝載的記錄3、創建需要導入的數據,注意數據格式必須和表結構嚴格對應,否則導入失敗!測試數據如下:有部分數據最後欄位為空,所以控制文件中需要加trailing nullcols 參數!
ttt,SCOTT,192.168.1.111,yes,1,
,JACK,192.168.1.20,no,1,
,TOM,192.168.1.20,no,1,
WEB1,HAHA,192.168.1.1,no,1,
XXX,ROBIN,111.111.111.111,no,1,08-AUG-08
DB2,LUCY,192.168.10.10,no,1,
ORACLE,LILY,222.222.222.222,no,1,
WORKGROUP,DENNIS,133.133.133.133,no,0,08-AUG-08DCR,CANDY,192.168.100.10,no,1,
T3,FLY,192.168.10.33,no,1,
T1,LINDA,192.168.10.200,no,1,08-AUG-08
T2,LILEI,192.168.100.31,no,1,08-AUG-08
4、導入數據-導入時也有相關的參數進行控制
附部分導入參數:各參數可以再命令行下輸入sqlldr查看C:\Documents and Settings\Administrator>sqlldrSQL*Loader: Release 11.2.0.1.0 - Proction on 星期三 2月 27 17:13:24 2013Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
用法: SQLLDR keyword=value [,keyword=value,...]
有效的關鍵字:
userid -- ORACLE 用戶名/口令
control -- 控制文件名
log -- 日誌文件名
bad -- 錯誤文件名
data -- 數據文件名
discard -- 廢棄文件名
discardmax -- 允許廢棄的文件的數目 (全部默認)skip -- 要跳過的邏輯記錄的數目 (默認 0)
load -- 要載入的邏輯記錄的數目 (全部默認)errors -- 允許的錯誤的數目 (默認 50)rows -- 常規路徑綁定數組中或直接路徑保存數據間的行數(默認: 常規路徑 64, 所有直接路徑)
bindsize -- 常規路徑綁定數組的大小 (以位元組計) (默認 256000)silent -- 運行過程中隱藏消息 (標題,反饋,錯誤,廢棄,分區)direct -- 使用直接路徑 (默認 FALSE)parfile -- 參數文件: 包含參數說明的文件的名稱parallel -- 執行並行載入 (默認 FALSE)file -- 要從以下對象中分配區的文件
skip_unusable_indexes -- 不允許/允許使用無用的索引或索引分區 (默認 FALSE)skip_index_maintenance -- 沒有維護索引, 將受到影響的索引標記為無用 (默認 FALSE)commit_discontinued -- 提交載入中斷時已載入的行 (默認 FALSE)readsize -- 讀取緩沖區的大小 (默認 1048576)external_table -- 使用外部表進行載入; NOT_USED, GENERATE_ONLY, EXECUTE (默認 NOT_USED)
columnarrayrows -- 直接路徑列數組的行數 (默認 5000)streamsize -- 直接路徑流緩沖區的大小 (以位元組計) (默認 256000)multithreading -- 在直接路徑中使用多線程
resumable -- 啟用或禁用當前的可恢復會話 (默認 FALSE)resumable_name -- 有助於標識可恢復語句的文本字元串resumable_timeout -- RESUMABLE 的等待時間 (以秒計) (默認 7200)date_cache -- 日期轉換高速緩存的大小 (以條目計) (默認 1000)no_index_errors -- 出現任何索引錯誤時中止載入 (默認 FALSE)如下命令:control=指定控制文件和路徑 log=導入日誌文件保存 bad=錯誤信息 data=數據文件開始導入:
C:\Documents and Settings\Administrator>sqlldr scott/tiger control=d:\sqlload.txt log=d:\loadlog.txt bad=d:\bad.txt data=d:\data.txtSQL*Loader: Release 11.2.0.1.0 - Proction on 星期三 2月 27 17:06:52 2013Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
達到提交點 - 邏輯記錄計數 12
導入成功後查看結果:
C:\Documents and Settings\Administrator>sqlplus scott/tigerSQL*Plus: Release 11.2.0.1.0 Proction on 星期三 2月 27 17:07:05 2013Copyright (c) 1982, 2010, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProctionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> select * from test;
HOST USER_NAME IP_ADDRESS PASS JUDGE ENDTIME---------- ---------- ------------------------------ -------- ---------- --------------ttt SCOTT 192.168.1.111 yes 1 JACK 192.168.1.20 no 1 TOM 192.168.1.20 no 1WEB1 HAHA 192.168.1.1 no 1DB2 LUCY 192.168.10.10 no 1ORACLE LILY 222.222.222.222 no 1DCR CANDY 192.168.100.10 no 1T3 FLY 192.168.10.33 no 1已選擇8行。
結果顯然與數據文件不一致,最後一個欄位有值的數據沒有導入!這不是最後想要的結果!但可以確定已經有數據導入,表示表對象和控制文件沒問題!
應該是數據文件的格式問題!注意數據文件最後一個欄位是日期型數據。查看是不是資料庫現有日期類型不支持數據文件的表示格式SQL> select sysdate from al;
SYSDATE
--------------
27-2月 -13
顯然和我們數據文件的日期顯示不一致,且是中文,這里可以把數據文件的最後欄位的數據改成和資料庫一樣的格式,也可以對資料庫的格式和語言進行更改,因為測試系統是windows才會出現這個錯誤,在linux可以避免!
如果是linux 可以嘗試以下步驟解決:
alter system set nls_date_format='DD-MON-RR';alter system set nls_language= american scope = spfile;------------得重啟資料庫這里由於是windows,這里就不更改語言和重啟資料庫,直接對數據文件進行更改,修改後的數據文件如下ttt,SCOTT,192.168.1.111,yes,1,
,JACK,192.168.1.20,no,1,
,TOM,192.168.1.20,no,1,
WEB1,HAHA,192.168.1.1,no,1,
XXX,ROBIN,111.111.111.111,no,1,08-5月 -08DB2,LUCY,192.168.10.10,no,1,
ORACLE,LILY,222.222.222.222,no,1,
WORKGROUP,DENNIS,133.133.133.133,no,0,08-5月 -08DCR,CANDY,192.168.100.10,no,1,
T3,FLY,192.168.10.33,no,1,
T1,LINDA,192.168.10.200,no,1,08-5月 -08
T2,LILEI,192.168.100.31,no,1,08-5月 -08
再導入一次,導入後進行查看結果
C:\Documents and Settings\Administrator>sqlldr scott/tiger control=d:\sqlload.txt log=d:\loadlog.txt bad=d:\bad.txt data=d:\data.txtSQL*Loader: Release 11.2.0.1.0 - Proction on 星期三 2月 27 17:48:44 2013Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
達到提交點 - 邏輯記錄計數 12
C:\Documents and Settings\Administrator>sqlplus scott/tigerSQL*Plus: Release 11.2.0.1.0 Proction on 星期三 2月 27 17:49:21 2013Copyright (c) 1982, 2010, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProctionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> col host for a10
SQL> col user_name for a15
SQL> select * from test;
HOST USER_NAME IP_ADDRESS PASS JUDGE ENDTIME---------- --------------- ------------------------------ -------- ---------- --------------ttt SCOTT 192.168.1.111 yes 1 JACK 192.168.1.20 no 1 TOM 192.168.1.20 no 1WEB1 HAHA 192.168.1.1 no 1XXX ROBIN 111.111.111.111 no 1 08-5月 -08DB2 LUCY 192.168.10.10 no 1ORACLE LILY 222.222.222.222 no 1WORKGROUP DENNIS 133.133.133.133 no 0 08-5月 -08DCR CANDY 192.168.100.10 no 1T3 FLY 192.168.10.33 no 1T1 LINDA 192.168.10.200 no 1 08-5月 -08T2 LILEI 192.168.100.31 no 1 08-5月 -08已選擇12行。
恢復正常:數據和數據文件完全一樣!到此整個數據導入完成!主要注意的地方還是數據文件的建立,確認分隔以及和表的結構對應!
㈧ SQL中表沒有列名稱的情況下如何創建一個虛擬列名稱
如圖所示為原表格結構。
㈨ sql2005和sql2008的區別
2005支持所有2000的語法,但是2005有新的功能,所以對系統要求也不一樣,比如你必須安裝.net 3.5的框架,其還有以下區別:
1、欄位類型。
SQL Server 2005引入了一系列 新的被稱為MAX的數據類型。這是VARCHAR,NVARCHAR和VARBINARY類型的擴展,這幾種類型 以前被限制在8000位元組以下。MAX可以容納高達2GB的數據,與TEXT和IMAGE一樣。
可以使用字元串函數對CLOB類型進行操作。但是這就引發了對varchar和char效率討論的老問題。到底如何分配varchar的數據,是否會出現大規模的碎片?是否碎片會引發效率問題?這都是需要進一步探討的東西。
2、外鍵的級聯更能擴展
新版本中外鍵級聯加入了SET NULL 和 SET DEFAULT 屬性,能夠提供能好的級聯設置
如果沒有指定 ON DELETE 或 ON UPDATE,則默認為 NO ACTION。
3、索引附加欄位
即在索引中存儲一些常用欄位以提高查詢速度,這是一個不錯的新特性。雖然索引的附加欄位沒有索引鍵值效率高,但是相對映射到數據表中效率還是提高了很多。在實驗環境中會比映射到表中提高30%左右的效率。
4、計算欄位的持久化
原來的計算欄位其實和虛擬欄位很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了計算欄位的持久化,這就提高了查詢的性能,但是會加重insert和update的負擔。OLTP慎用。OLAP可以大規模使用。
5、分區表
分區表是個亮點!從分區表也能看出微軟要做大作強SQL Server的信心。資料很多,這里不詳細說。但是重點了解的是:現在的SQL Server2005的表,都是默認為分區表的。因為它要支持滑動窗口的這個特性。這種特性對歷史數據和實時數據的處理是很有幫助的。
6、CLR類型
微軟對CLR作了大篇幅的宣傳,這是因為資料庫產品終於融入.net體系中。最開始我們也是狂喜,感覺對象資料庫的一些概念可以實現了。但是作了些試驗, 發現使用CLR的存儲過程或函數在達到一定的閥值的時候,系統性能會呈指數級下滑!這是非常危險的!只使用幾個可能沒有問題,當一旦大規模使用會造成嚴重 的系統性能問題!
7、索引視圖
索引視圖2k就有。但是2005對其效率作了一些改進但是schema.viewname的作用域真是太限制了它的應用面。還有一大堆的環境參數和種種限制都讓人對它有點卻步。
8、語句和事務快照
語句級快照和事務級快照終於為SQL Server的並發性能帶來了突破。個人感覺語句級快照大家應該應用。事務級快照,如果是高並發系統還要慎用。如果一個用戶總是被提示修改不成功要求重試時,會殺人的!
9、資料庫快照
原理很簡單,對要求長時間計算某一時間點的報表生成和防用戶操作錯誤很有幫助。但是比起Oracle10g的閃回技術還是細粒度不夠。
2005與2008的區別
2008 引入新的日期和時間數據類型:
DATE - 僅表示日期的類型
TIME - 僅表示時間的類型
DATETIMEOFFSET - 可以感知時區的 datetime 類型
DATETIME2 - 比現有 DATETIME 類型具有更大小數位和年份范圍的datetime 類型
新的數據類型允許應用程序擁有獨立的日期和時間類型,同時為時間值提供大的數據范圍或用戶定義的精度。
2008的備份採用了比較好的壓縮策略。
2008的庫文件可以加密了,別人拷走也沒意義。
2005不能調試,要調試必須裝VS2005開發板或者企業版以上才行。
2008把調試器又請回來了!方便多了!!
2008 增加了輸入智能提示功能。
㈩ Mysql 5.7新特性: JSON欄位、虛擬列、視圖
alter table ba_bgt_info add v_is_auto varchar(300) generated always AS(manage_categories->"$.isAuto")
在MySQL 5.7中,支持兩種Generated Column,即Virtual Generated Column和Stored Generated Column,前者只將Generated Column保存在數據字典中(表的元數據),並不會將這一列數據持久化到磁碟上;後者會將Generated Column持久化到磁碟上,而不是每次讀取的時候計算所得。很明顯,後者存放了可以通過已有數據計算而得的數據,需要更多的磁碟空間,與Virtual Column相比並沒有優勢,因此,MySQL 5.7中,不指定Generated Column的類型,默認是Virtual Column。
如果需要Stored Generated Golumn的話,可以在Virtual Generated Column上建立索引更加合適
綜上,一般情況下,都使用Virtual Generated Column,這也是MySQL默認的方式
能正常加索引、特殊用途冗餘列、列長度還是和定義類型一樣、查詢效率上,物理>STORED>VIRTUAL
虛擬列: 一個或多個欄位的數據函數處理後的結果集映射成的欄位
視圖: 一個或多個表依照某個條件組合而成的結果集(相當於一個查詢sql語句的結果集映射成的虛擬表)
其本質其實都是以空間換時間
什麼是視圖?視圖是干什麼用的?
視圖(view)是一種虛擬存在的表,是一個邏輯表,本身並不包含數據。作為一個select語句保存在數據字典中的。
通過視圖,可以展現基表的部分數據;視圖數據來自定義視圖的查詢中使用的表,使用視圖動態生成。
基表: 用來創建視圖的表叫做基表base table
因為視圖的諸多優點,如下
總而言之,使用視圖的大部分情況是為了保障數據安全性,提高查詢效率。