前面兩次點滴分享中,筆者與我們分享了SET QUOTED_IDENTIFIER 的作用,並給我們介紹了一個簡單的字串分割函數。這一次,筆者為我們介紹怎麼從SQL Server中找出所有的資料列的類型,欄位大小,是否可為空白,是否是主鍵,約束等等資訊。
項目需要將Access資料庫中的資料匯入到SQL Server中,需要檢驗匯入後的資料完整性,資料值是否正確。我們使用的是Microsoft SQL Server 2008 Migration Assistant for Access這個工具,次工具專門用來將Access中的資料庫匯出到SQL Server中,我們的疑慮是這個匯出過程中會不會因為認為的原因導致資料錯誤或者資料之間的關聯丟失,看起來有點多次一舉,但是還是找方法來做測試。於是就產生了今天的問題,怎麼從SQL Server中找出所有的資料列的類型,欄位大小,是否可為空白,是否是主鍵,約束等等資訊。我找很多資料鼓搗出這個預存程序,先來看看代碼:
- USE [MIS]
- GO
-
- /****** Object: StoredProcedure [dbo].[sp_SelectColumnInfor] Script Date: 09/23/2010 19:00:28 ******/
- SET ANSI_NULLS ON
- GO
-
- SET QUOTED_IDENTIFIER ON
- GO
-
- create procedure [dbo].[sp_SelectColumnInfor]
- as
- declare @table_name varchar(250)
- --create a temp table
- create table #tempTable(
- TABLE_NAME nvarchar(128),
- COLUMN_NAME nvarchar(128),
- IS_NULLABLE varchar(3),
- DATA_TYPE nvarchar(128),
- CHARACTER_MAXIMUM_LENGTH int,
- CONSTRAINT_NAME nvarchar(128),
- )
- --create a cursor
- declare curTABLE cursor for
- select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE'
- for read only
-
- open curTABLE
- fetch next from curTABLE into @table_name
- while @@FETCH_STATUS =0
- begin
- insert into #tempTable
- select sc.[TABLE_NAME],sc.[COLUMN_NAME],sc.[IS_NULLABLE],sc.[DATA_TYPE],sc.[CHARACTER_MAXIMUM_LENGTH]
- ,scc.CONSTRAINT_NAME
- from INFORMATION_SCHEMA.COLUMNS sc
- left join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE scc on sc.COLUMN_NAME=scc.COLUMN_NAME and sc.TABLE_NAME=scc.TABLE_NAME
- where sc.[TABLE_NAME]=@table_name --order by TABLE_NAME,COLUMN_NAME
-
- fetch next from curTABLE into @table_name
- end
- close curTABLE
- deallocate curTABLE
- select * from #tempTable order by TABLE_NAME,COLUMN_NAME
- drop table #tempTable
- GO
其實很簡單的,只要查查INFORMATION_SCHEMA.COLUMNS , INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE這兩個系統檢視表的功能就能明白。來看看執行這個預存程序得到的結果:
下次介紹Microsoft SQL Server 2008 Migration Assistant for Access這個工具的用法。