电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

關于獲取SQL Server 2000的自增長字段值

瀏覽:153日期:2023-10-28 08:25:05

原文:Check Your SQL Server Identity來源:sqlservercentral.com作者:Andy Warren

過去的幾個月里,我有幸面試了眾多應聘DBA和DB開發崗位的求職者。我們希望開發人員能夠創建存儲過程,編寫合理的復雜SQL語句,以及觸發器。我喜歡問這些求職者一個問題:

“假設我們使用SQL Server2000進行開發?,F在我需要傳遞給存儲過程兩個變量:firstname和lastname。存儲過程負責向名字為TEST的表插入這兩個變量,其中TEST表有兩個字段,名字就叫firstname和lastname。TEST表的主鍵是一個自增長類型的字段,名字叫ContactID。問題是我如何獲取插入的那條數據的主鍵值。”

讓我們想一下答案是什么。你是否知道如何創建存儲過程,獲取數值并返回給調用的應用程序?

有人會直接問我-這個問題重要嗎?對于我來說,我問這個問題的目的是為了測試求職者是否有求解非常規需求的能力。設想一下標準的訂單/訂單明細表應用場景--你是否知道如何不知道訂單主鍵的情況下插入訂單的詳細信息?當你因為沒有使用主鍵時,可能會帶來鎖問題。這時,自增長字段加入是常用的一個手段。但是使用@@Identity來獲取插入數據的標識,有可能會帶來問題,比如在觸發器內使用就會發生問題。這并不是一個可以給出唯一答案的問題,但是這個問題可以讓我們對處理類似表的問題,來展開討論。

我收到了很多不同的回答,但是絕大多數并非最優。幾乎每個人都知道如何插入數據、如何返回值,但是幾乎每個人都在獲取自增長字段取值上回答得不是很好。

錯誤回答 #1 - Select max(contactid) from Test. 因為你無法避免別人也同時在插入數據,因此這個回答是錯誤的。當然,你可以通過提升隔離級別來達到目的,但是這將會大幅降低并發性能,因此不好。

錯誤回答 #2 - Select top 1 contactid from test order by contactid desc. 錯誤的原因和回答#1一樣。

錯誤回答 #3 - 通過插入的數據來組合成一個唯一的標識,從而獲得自增長字段的值。如果插入的數據確實組合起來是唯一的,能達到目的,但是如果不唯一,怎么辦呢?因此這也不是好辦法。

錯誤回答 #4 - 這個回答很接近正解了。這些回答者建議使用@@Identity,自然這是可以的 (小心,要知道如何正確使用@@Identity), 但是當我問他們關于@@Identity的相關技術細節時,我收到最多的答案如下:

- 對不起,我不是很清楚。- 你應該盡快獲取@@Identity的值,因為其它人的對表插入數據,也會改變這個值。- 是的,獲取最后一個identity值,在大多數情況下是可行的,但是如果在TEST表上有觸發器,這個觸發器會自動向別的表插入數據,如果那個表也同樣有一個自增長字段,那么錯誤就會發生。此時,你獲取的@@Identity取值是那個表的identity取值(注意:這個回答正確地描述了 @@Identity的行為)。 正確答案 - 因為我們使用的是SQL Server 2000,因此使用Scope_Identity() , 如果用的是SQL Server 7,那么只有只用@@Identity,并且以output參數方式傳遞(return值一般是用來作為錯誤代碼用)。使用@@Identity意味著將來也許會發生錯誤,例如審核時使用自增長字段。

現在我們來做一系列的試驗來驗證:

create database IdentityTestuse identitytestcreate table TEST (ContactID int not null identity (1, 1), firstname varchar(100) null, lastname varchar(100) null)insert into TEST Default Valuesselect @@Identity

運行后會返回1。如果在此運行,則返回 2。

insert into TEST Default Valuesselect Scope_Identity()

運行后返回 3。

現在我們來設計如何使@@Identity返回錯誤結果。我們先創建一個包含一個新的自增長字段的表TESTHISTORY,然后在TEST表上加觸發器。

create table TESTHISTORY (HistoryID int not null identity (1, 1), ContactID int not null, firstname varchar(100) null, lastname varchar(100) null)create trigger i_TEST on dbo.TEST for insert as

set nocount on

insert into TESTHISTORY (ContactID, FirstName, LastName) select ContactID, FirstName, LastName from Inserted

現在看看會發生什么:

insert into TEST Default Valuesselect @@Identity

返回值為1。注意,此時TEST表最后插入的記錄,主鍵值為4,而TESTHISTORY表作后插入記錄的主鍵值=1。

insert into TEST Default Valuesselect @@Identity

返回值為5。TEST表最后插入記錄的主鍵值為5,而且TESTHISTORY表的確也插入了第二條記錄。現在我們再測試如果同時有別的連接來向插入TEST表插入數據,情況會如何。首先我們用當前的連接,運行:

insert into TEST Default Values

此時,TEST插入了第6條記錄。然后新建一個連接,并運行相同的SQL語句:

insert into TEST Default Values

此時,TEST表插入了第7條記錄。然后我們在原先那個連接里,來獲取“錯誤”的結果,值為3。

select @@Identity

現在我們用scope_identity()來測試。我們希望得到的結果是6,不是7!

select Scope_Identity()

結果確實如此,證明使用scope_identity()是正確的。我知道,這樣測試很麻煩,你也許不會去仔細探究。但是如果你準備使用SQL Server 2000,你就必須知道它是如何工作的。有興趣用這個問題來考考你的開發人員,可以教他們一些專業的開發技巧,這樣也許會使你在將來省卻很多本可以避免的麻煩。

標簽: Sql Server 數據庫
主站蜘蛛池模板: 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 税筹星_灵活用工平台_企业财务顾问_财税法薪综合服务平台 | 【法利莱住人集装箱厂家】—活动集装箱房,集装箱租赁_大品牌,更放心 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 中央空调温控器_风机盘管温控器_智能_液晶_三速开关面板-中央空调温控器厂家 | 浙江自考_浙江自学考试网| 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 三防漆–水性三防漆–水性浸渍漆–贝塔三防漆厂家 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 天坛家具官网| 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 写方案网_方案策划方案模板下载| 定量包装秤,吨袋包装称,伸缩溜管,全自动包装秤,码垛机器人,无锡市邦尧机械工程有限公司 | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 建筑资质代办_工程施工资质办理_资质代办公司_北京众聚企服 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 【连江县榕彩涂料有限公司】官方网站 | 制样机-密封锤式破碎机-粉碎机-智能马弗炉-南昌科鑫制样 | 苏州西朗门业-欧盟CE|莱茵UL双认证的快速卷帘门品牌厂家 | 宜兴紫砂壶知识分享 - 宜兴壶人 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 湖南教师资格网-湖南教师资格证考试网 |