使用自定義表型別(SQL Server 2008)

2021-08-25 04:19:56 字數 3600 閱讀 5375

在 sql server 2008 中,使用者定義表型別是指使用者所定義的表示表結構定義的型別。您可以使用使用者定義表型別為儲存過程或函式宣告錶值引數,或者宣告您要在批處理中或在儲存過程或函式的主體中使用的表變數。有關如何定義表結構的詳細資訊,請參閱 create table (transact-sql)。

若要建立使用者定義表型別,請使用 create type 語句。為了確保使用者定義表型別的資料滿足特定要求,您可以對使用者定義表型別建立唯一約束和主鍵。

有關與使用者定義型別相關聯的目錄檢視的資訊,請參閱 sys.types 和 sys.table_types。

限制 使用者定義表型別具有下列限制:

使用者定義表型別不能用作表中的列或結構化使用者定義型別中的字段。

基於使用者定義表型別的別名型別

[not for replication] 選項是不允許的。

check 約束要求保留計算列。

計算列的主鍵必須是 persisted 和 not null。

無法對使用者定義表型別建立非聚集索引,除非該索引是對使用者定義表型別建立 primary key 或 unique 約束的結果。(sql server 使用索引強制實施任何 unique 或 primary key 約束。)

不能在使用者定義表型別的定義中指定 default 值。

在建立使用者定義表型別定義後不能對其進行修改。

不能在使用者定義表型別的計算列的定義中呼叫使用者定義函式。

安全性

使用者定義表型別的許可權通過使用下列 transact-sql 關鍵字來遵循 sql server 的物件安全模式:create、grant、deny、alter、control、take ownership、references、execute、view definition 和 revoke。

下面我用乙個例項來講解一下

-- ******************************==

-- 建立和使用自定義表型別

-- 陳希章

-- ******************************== 

use master

go-- ******************************==

-- 建立測試資料庫

-- ******************************==

create database demo

go -- ******************************==

-- 建立乙個表

-- ******************************==

use demo

go create table customers

(id int not null, 

name char(10) null, 

primary key (id)

)go 

use demo

go-- ******************************==

-- 建立自定義表型別

-- ******************************==

create type dbo.customertable as table 

(id int not null, 

name char(10) null, 

primary key (id)

)go 

-- ******************************===

-- 直接使用自定義表型別

-- ******************************===

declare @c customertable

insert into @c values(1,'xizhang')

select * from @c 

-- ******************************===

-- 在儲存過程中使用自定義表型別

-- ******************************===

create proc getcustomers

(@c customertable readonly)

asinsert customers select * from @c --將傳過來的引數(其實是乙個表)的資料插入到customers表裡面去 

-- ******************************===

-- 呼叫該儲存過程,一次性插入4行資料

-- ******************************===

declare @temp customertable

insert into @temp values(7,'xizhang')

insert into @temp values(2,'xizhang')

insert into @temp values(3,'xizhang')

insert into @temp values(4,'xizhang')

exec getcustomers @c=@temp

select * from customers 

-- ******************************===

-- 清理資料庫

-- ******************************===

use master

go drop database demo

go看起來不錯對吧,但是你應該馬上想到乙個問題,如果說這個儲存過程要在客戶端**中呼叫,那麼該怎麼提供這個引數值呢?

using system.data.sqlclient;

using system.data; 

class program

} console.writeline("完成操作");

console.read();

} private static datatable getdata()

return tb;

}}讀者可能會疑惑,這樣做實在是太棒了,可以一次性寫入100行資料呢?我們再來看看在服務端到底發生了什麼事情

看不清楚?這裡檢視原圖(大圖)。

實際上,在服務端確實會有乙個定義臨時變數的過程,然後把所有的資料插入到這個變數中去,然後再執行儲存過程的

最後,我們可以再深入****

1. 客戶端是否一定用datatable型別

-- 推薦使用datatable型別,但也可以使用其他的型別,例如datareader的資料流

2. datatable的欄位名稱是否要匹配

--不一定。只要順序一致,型別一樣就可以了。

使用自定義表型別(SQL Server 2008)

在 sql server 2008 中,使用者定義表型別是指使用者所定義的表示表結構定義的型別。您可以使用使用者定義表型別為儲存過程或函式宣告錶值引數,或者宣告您要在批處理中或在儲存過程或函式的主體中使用的表變數。有關如何定義表結構的詳細資訊,請參閱 create table transact sq...

自定義型別

typedef型別 typedef 已有型別 新建型別 示例 typedef double area,volume typedef int number number i1 area a enum enum 列舉型別名 enum week 預設sun 0,可以比較 如果修改必須形如enum week...

自定義型別

下面列舉幾種c語言中常用的自定義資料型別 1.結構體型別 當描述乙個整型變數時,可以用int,描述字元型變數時,可以用char,但要描述乙個學生時,因為這個學生包含的資訊很多,比如姓名,性別,年齡等,不能通過單一的型別來描述,所以,這裡引入結構體型別,將某個事物的共有屬性集合在一起,宣告乙個結構體型...