個人學習之3 關於LOB和資料的隱式轉化

2021-05-08 19:14:07 字數 2627 閱讀 3370

1.關於lob(large object)

2005後sql 引進了新的max說明符來支援lob。雖然這個版本的text,ntext,image繼續被支援著,因為前者的出現而不再推薦使用。

它還引入了xml資料型別,允許你儲存和處理xml資料。還允許使用bulk引擎高效地將檔案資料載入為行集。

max:

通過max說明符,儲存的值可以高達2gb 這是目前為止最大量的資料型別。

2005中統一了常規資料型別和lob型別的程式設計模型,所有支援常規型別的函式現在也支援由max說明符定義的資料型別。

update dbo.customerdata

set txt_data.write('one hundred and two', 9, 3)

where custid = 102;

--'one hundred and two' 是替換的目標值,9是替換的起始位置(從0開始,9就是第十個),3替換長度

write(a,b,c)

1.a為null 從b位置開始的字串截斷

2.b為null && c==0 把a直接新增到字串的末尾

3.c為null b之後的字串截斷,然後將a新增到字串末尾

另外:如果資料物件為null,write方法更新失效

bulk:

--建表

if object_id('dbo.shippers') is not null

drop table dbo.shippers;go

create table dbo.shippers

(shipperid   int          not null primary key,

companyname nvarchar(40) not null,

phone       nvarchar(24) not null check(phone not like '%[^0-9() ]%')

);go

--利用openrowset函式返回值作為表

insert into dbo.shippers with (ignore_constraints)--目標表(ignore_constraints 插入時候無視約束)

select shipperid, companyname, phone

from openrowset(bulk 'c:/temp/shippers.txt',

formatfile = 'c:/temp/shippers.fmt') as s;

--這裡關於bulk的資料轉移不再多說 內容很多 日後整理出大量資料遷移的三種基本方法 bcp, insert bulk, openrowset(bulk...) 後續學習後整理。

2.隱式轉化

大家都知道當2個不同資料型別的資料進行計算的時候 首先低優先順序向高優先順序轉化,然後計算

附上資料型別優先順序表:

使用者定義資料型別(最高)

sql_variant

xml

datetime

smalldatetime

float

real

decimal

money

smallmoney

bigint

int

smallint

tinyint

bit

ntext

text

image

timestamp

uniqueidentifier

nvarchar(包括 nvarchar(max))

nchar

varchar (包括 varchar(max))

char

varbinary(包括 varbinary(max))

binary(最低)

這就是為什麼1+'1' =2 ,1. *col 結果為decimal型別了

下面說個由自動轉換引發的問題:

select

case

when 1 > 1 then 10

when 1 = 1 then 'abc'

when 1 < 1 then 10.

end;

-----錯誤:訊息 8114,級別 16,狀態 5,第 1 行

從資料型別 varchar 轉換為 numeric 時出錯。

為什麼會錯呢?從錯誤可以看出 本來預想的結果為『abc』 然後我們看'abc' 10 10. 資料型別分別為varchar,int,numeric 優先順序最高為

numeric ,所以結果也應該是numeric 『abc』無法轉成numeric 所以。。。。

解決方法有2個:

1.將結果表示式都轉化成通用的資料型別,比如varchar(100),但是這樣做的可能會出現比較,排序的時候的問題

2.將結果表示式都轉化成sql_variant

select

case

when 1 > 1 then cast(10 as sql_variant)

when 1 = 1 then cast('abc' as sql_variant)

when 1 < 1 then cast(10. as sql_variant)

end;

Redis個人學習筆記3 五大資料型別之字串

根據b站up主狂神說redis課程所寫的個人學習筆記 redis key 127.0.0.1 6379 keys 檢視所有的key empty array 127.0.0.1 6379 set name lin set key ok127.0.0.1 6379 keys 1 name 127.0.0...

Redis個人學習筆記3 五大資料型別之集合

根據b站up主狂神說redis課程所寫的個人學習筆記 set中的值是不能重複的 127.0.0.1 6379 sadd myset hello set集合中新增元素 integer 1 127.0.0.1 6379 sadd myset lin integer 1 127.0.0.1 6379 sa...

關於D3D的學習和個人理解 1

w 單字 wspeed dw 雙字 dwhitlist 命名規範 每個directx方法都會返回乙個 hresult 組織 以使其可以檢查並處理所有可能的錯誤。正題1.頂點 1.1內容 頂點即乙個3dworld中的點。頂點 vector與jme中的math包下 vector3f相同。分別為d3d9t...