以前的以前,有个哥们给我说过cursor可以通过sql来进行替代,为什么要替代,终归是性能。无奈那个时候对sql理解有限,现在仍旧有限。但是至少自己还是终于把这个问题理解清楚了。
其实很简单,看完这个例子,你就知道了。我在注视中写明了几个重要的性能指标。希望对您有所帮助
Code USE SQL441GOCREATE TABLE tbl_culsor2sql_pdt( sn nvarchar(10) not null, lbl nvarchar(20) null)GOCREATE TABLE tbl_culsor2sql_data( sn nvarchar(10) not null, lbl nvarchar(20) null)GOINSERT INTO tbl_culsor2sql_pdtVALUES('1Q2A3A4Z',NULL)INSERT INTO tbl_culsor2sql_pdtVALUES('4F5D6R4F',NULL)INSERT INTO tbl_culsor2sql_pdtVALUES('9S9X3J7D',NULL)INSERT INTO tbl_culsor2sql_pdtVALUES('0X9D8K9X',NULL)GOINSERT INTO tbl_culsor2sql_dataVALUES('1Q2A3A4Z','CNDTD7550000001')INSERT INTO tbl_culsor2sql_dataVALUES('4F5D6R4F','CNDTD7550000002')INSERT INTO tbl_culsor2sql_dataVALUES('9S9X3J7D','CNDTD7550000003')INSERT INTO tbl_culsor2sql_dataVALUES('0X9D8K9X','CNDTD7550000004')GOSELECT sn,lbl FROM tbl_culsor2sql_pdtGOSELECT sn,lbl FROM tbl_culsor2sql_dataGO/****** Cursor ******/UPDATE tbl_culsor2sql_pdt SET lbl = NULL-- Declare a cursorDECLARE custom_cursor CURSOR FOR SELECT sn, lbl FROM tbl_culsor2sql_data-- declare a temporary variousDECLARE @sn varchar(10)DECLARE @lbl varchar(20)-- open the cursorOPEN custom_cursor--GET THE NEXT RECORDFETCH NEXT FROM custom_cursor INTO @sn , @lbl-- GET SUCCESSFULLYWHILE @@FETCH_STATUS = 0BEGIN UPDATE tbl_culsor2sql_pdt SET lbl = @lbl WHERE SN = @sn FETCH NEXT FROM custom_cursor INTO @sn, @lblEND--DELETE THE CURSORDEALLOCATE custom_cursor /****** 10 query plan5 table scan5 table update5 cluster index insert on tempdb******//****** SQL ******/UPDATE tbl_culsor2sql_pdt SET lbl = NULLGOUPDATE tbl_culsor2sql_pdtSET lbl = DATA.lblFROM tbl_culsor2sql_pdt AS PDTINNER JOIN tbl_culsor2sql_data AS DATAON PDT.sn = DATA.sn/****** 1 query plan2 table scan1 table update******/