SQL SERVER 自增列

來源:互聯網
上載者:User

declare @Table_name varchar(60)

set @Table_name = '';

if Exists(Select top 1 1 from sysobjects
Where objectproperty(id, 'TableHasIdentity') = 1
and upper(name) = upper(@Table_name)
)
select 1
else select 0

-- or

if Exists(Select top 1 1 from sysobjects so
Where so.xtype = 'U'
and upper(so.name) = upper(@Table_name)
and Exists(Select Top 1 1 from syscolumns sc
Where sc.id = so.id
and columnproperty(sc.id, sc.name, 'IsIdentity') = 1
)
)
select 1
else select 0

判斷Table是否存在自增列(Identity column),並查出自增列相關資料:

declare @Table_name varchar(60)
set @Table_name = '';

declare @Table_name varchar(60)
set @Table_name = 'zy_cost_list';
Select so.name Table_name, --表名字
sc.name Iden_Column_name, --自增欄位名字
ident_current(so.name) curr_value, --自增欄位當前值
ident_incr(so.name) incr_value, --自增欄位增長值
ident_seed(so.name) seed_value --自增欄位種子值
from sysobjects so
Inner Join syscolumns sc
on so.id = sc.id
and columnproperty(sc.id, sc.name, 'IsIdentity') = 1
Where upper(so.name) = upper(@Table_name)

資料引用:

DBCC CHECKIDENT

檢查指定表的當前標識值,如有必要,還對標識值進行更正。

文法

DBCC CHECKIDENT
( 'table_name'
[ , { NORESEED
| { RESEED [ , new_reseed_value ] }
}
]
)

參數

'table_name'

是要對其當前標識值進行檢查的表名。表名必須符合標識符規則。有關更多資訊,請參見使用標識符。指定的表必須包含識別欄位。

NORESEED

指定不應更正當前標識值。

RESEED

指定應該更正當前標識值。

new_reseed_value

是在識別欄位中重新賦值時要使用的值。

注釋

如有必要,DBCC CHECKIDENT 會更正列的當前標識值。然而,如果識別欄位是使用 NOT FOR REPLICATION 子句(在 CREATE TABLE 或 ALTER TABLE 語句中)建立的,則不更正當前標識值。

如果識別欄位上有主鍵或唯一鍵約束,無效標識資訊可能會導致錯誤資訊 2627。

對當前標識值所做的具體更正取決於參數規範。

DBCC CHECKIDENT 語句 所做的標識更正
DBCC CHECKIDENT ('table_name', NORESEED) 不重設當前標識值。DBCC CHECKIDENT 返回一個報表,它指明當前標識值和應有的標識值。
DBCC CHECKIDENT ('table_name') 或
DBCC CHECKIDENT ('table_name', RESEED)
如果表的當前標識值小於列中儲存的最大標識值,則使用識別欄位中的最大值對其進行重設。
DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 當前值設定為 new_reseed_value。如果自建立表後沒有將行插入該表,則在執行 DBCC CHECKIDENT 後插入的第一行將使用 new_reseed_value 作為標識。否則,下一個插入的行將使用 new_reseed_value + 1。如果 new_reseed_value 的值小於識別欄位中的最大值,以後引用該表時將產生 2627 號錯誤資訊。

當前標識值可以大於表中的最大值。在此情況下,DBCC CHECKIDENT 並不自動重設當前標識值。若要在當前標識值大於列中的最大值時對當前標識值進行重設,請使用兩種方法中的任意一種:

  • 執行 DBCC CHECKIDENT ('table_name', NORESEED) 以確定列中的當前最大值,然後使用 DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 語句將該值指定為 new_reseed_value

  • new_reseed_value 置為很小值來執行 DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value),然後運行 DBCC CHECKIDENT ('table_name', RESEED)。
結果集

不管是否指定任何選項(針對於包含識別欄位的表;下例使用 pubs 資料庫的 jobs 表),DBCC CHECKIDENT 返回以下結果集(值可能會有變化):

Checking identity information: current identity value '14', current column value '14'.DBCC execution completed. If DBCC printed error messages, contact your system administrator.
許可權

DBCC CHECKIDENT 許可權預設授予表所有者、sysadmin 固定伺服器角色和 db_owner 固定資料庫角色的成員且不可轉讓。

樣本A. 如有必要,重設當前標識值

下例在必要的情況下重設 jobs 表的當前標識值。

USE pubsGODBCC CHECKIDENT (jobs)GO
B. 報告當前標識值

下例報告 jobs 表中的當前標識值;如果該標識值不正確,並不對其進行更正。

USE pubsGODBCC CHECKIDENT (jobs, NORESEED)GO
C. 強制當前標識值為 30

下例強制 jobs 表中的當前標識值為 30。

USE pubsGODBCC CHECKIDENT (jobs, RESEED, 30)GO
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.