注释
å½?SET XACT_ABORT ä¸?ON æ—Óž¼Œå¦‚æžœ Transact-SQL è¯å¥äº§ç”Ÿ˜q行旉™”™è¯¯ï¼Œæ•´ä¸ªäº‹åŠ¡ž®†ç»ˆæ¢åÆˆå›žæ»šã€‚äØ“ OFF æ—Óž¼Œåªå›žæ»šäñ”生错误的 Transact-SQL è¯å¥åQŒè€Œäº‹åС将¾l§ç®‹˜q›è¡Œå¤„ç†ã€‚ç¼–è¯‘é”™è¯¯ï¼ˆå¦‚è¯æ³•错误)ä¸å— SET XACT_ABORT 的媄å“ã€?br />
注释
å½?SET QUOTED_IDENTIFIER ä¸?ON æ—Óž¼Œæ ‡è¯†½W¦å¯ä»¥ç”±åŒå¼•å·åˆ†éš”,而文å—å¿…™åÈ”±å•引å·åˆ†éš”。当 SET QUOTED_IDENTIFIER ä¸?OFF æ—Óž¼Œæ ‡è¯†½W¦ä¸å¯åР引å·åQŒä¸”å¿…é¡»½W¦åˆæ‰€æœ?Transact-SQL æ ‡è¯†½W¦è§„则ã€?/p>
SET ANSI_NULLS { ON | OFF }
注释
SQL-92 æ ‡å‡†è¦æ±‚在对½Iºå€ÆD¿›è¡Œç‰äº?(=) 或丽{‰äºŽ (<>) 比较时å–å€égØ“ FALSE。当 SET ANSI_NULLS ä¸?ON æ—Óž¼Œå³ä‹É column_name ä¸åŒ…å«ç©ºå€û|¼Œä½¿ç”¨ WHERE column_name = NULL çš?SELECT è¯å¥ä»è¿”回零行。å³ä½?column_name ä¸åŒ…å«éž½Iºå€û|¼Œä½¿ç”¨ WHERE column_name <> NULL çš?SELECT è¯å¥ä»ä¼š˜q”回零行ã€?
å½?SET ANSI_NULLS ä¸?OFF æ—Óž¼Œ½{‰äºŽ (=) 和丽{‰äºŽ (<>) 比较˜qç®—½W¦ä¸éµä»Ž SQL-92 æ ‡å‡†ã€‚ä‹Éç”?WHERE column_name = NULL çš?SELECT è¯å¥˜q”回 column_name ä¸åŒ…å«ç©ºå€¼çš„行。ä‹Éç”?WHERE column_name <> NULL çš?SELECT è¯å¥˜q”回列ä¸åŒ…å«éžç©ºå€¼çš„行。æ¤å¤–,使用 WHERE column_name <> XYZ_value çš?SELECT è¯å¥˜q”回所有ä¸ä¸?XYZ_value 也ä¸ä¸?NULL 的行ã€?
æœ‰æ—¶å€™éœ€è¦æ‰¹é‡åŒæ¥æ•°æ®åº“çš„default value ¾U¦æŸ(constraint)åQŒåœ¨SQL2005ä¸ï¼Œå¯ä»¥é€šè¿‡sys.default_constraints¾pÈ»Ÿè§†å›¾æ¥èŽ·å–该数æ®åº“的视图或者æŸä¸ªè¡¨å¯¹åº”的视图ã€?
该视å›ùN»˜è®¤å¯¹åº”å—ŒD?
nameåQšçº¦æŸå
object_id åQšçº¦æŸID
parent_object_idåQšçº¦æŸå¯¹åº”的表ID
parent_column_idåQšçº¦æŸå¯¹åº”表ä¸çš„½W¬å‡ åˆ?
definitionåQšé»˜è®¤å€?
如下SQL查询defaulttestæ•°æ®åº“ä¸test1表所有的default value constraints ã€?
SELECT * FROM sys.default_constraints WHERE sys.default_constraints.parent_object_id=OBJECT_ID('test1')
修改带有¾U¦æŸçš„æ•°æ®è¡¨¾l“æž„è®²äº†å¦‚ä½•åˆ é™¤å’Œæ·»åŠ çº¦æŸï¼Œä¸‹é¢çš„è¯å¥ä¼šåˆ—出所有的default value constraintã€?
SELECT
sys.default_constraints.name AS name,
sys.[tables].name AS tablename
FROM sys.default_constraints
LEFT JOIN sys.tables ON
sys.[tables].object_id=sys.[default_constraints].parent_object_id
ç„¶åŽä½¿ç”¨æ¸¸æ ‡éåŽ†åˆ é™¤å¯¹åº”è¡¨çš„¾U¦æŸå›_¯
--æ¡äšg1 UPDATE Personnel SET salary = salary * 0.9 WHERE salary >= 5000; --æ¡äšg2 UPDATE Personnel SET salary = salary * 1.15 WHERE salary >= 2000 AND salary < 4600;
UPDATE Personnel SET salary = CASE WHEN salary >= 5000   THEN salary * 0.9 WHEN salary >= 2000 AND salary < 4600 THEN salary * 1.15 ELSE salary END;
p_key | col_1 | col_2 |
a | 1 | å¼ ä¸‰ |
b | 2 | æŽå›› |
c | 3 | 王五 |
a
å’?code>bç›æ€º’交æ¢ã€‚用Case函数æ¥å®žçŽ°çš„è¯ï¼Œä»£ç 如下 UPDATE SomeTable SET p_key = CASE WHEN p_key = 'a' THEN 'b' WHEN p_key = 'b' THEN 'a' ELSE p_key END WHERE p_key IN ('a', 'b');
--使用IN的时�/span>
SELECT keyCol,
CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
--使用EXISTS的时�/span>
SELECT keyCol,
CASE WHEN EXISTS ( SELECT * FROM tbl_B
WHERE tbl_A.keyCol = tbl_B.keyCol )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
å¦å·(std_id) | 评¡¨‹ID(class_id) | 评¡¨‹å?class_name) | ä¸ÖM¿®flagåQˆmain_class_flg) |
100 | 1 | ¾l济å?/td> | Y |
100 | 2 | 历å²å?/td> | N |
200 | 2 | 历å²å?/td> | N |
200 | 3 | 考å¤å?/td> | Y |
200 | 4 | 计算�/td> | N |
300 | 4 | 计算�/td> | N |
400 | 5 | åŒ–å¦ | N |
500 | 6 | æ•°å¦ | N |
--æ¡äšg1åQšåªé€‰æ‹©äº†ä¸€é—¨è¯¾½E‹çš„å¦ç”Ÿ SELECT std_id, MAX(class_id) AS main_class FROM Studentclass GROUP BY std_id HAVING COUNT(*) = 1;
STD_ID MAIN_class
------ ----------
300 4
400 5
500 6
--æ¡äšg2åQšé€‰æ‹©å¤šé—¨è¯„¡¨‹çš„å¦ç”?/span>
SELECT std_id, class_id AS main_class
FROM Studentclass
WHERE main_class_flg = 'Y' ;
STD_ID MAIN_class
------ ----------
100 1
200 3
SELECT std_id, CASE WHEN COUNT(*) = 1 --åªé€‰æ‹©ä¸€é—¨è¯¾½E‹çš„å¦ç”Ÿçš„æƒ…å†?/span> THEN MAX(class_id) ELSE MAX(CASE WHEN main_class_flg = 'Y' THEN class_id ELSE NULL END ) END AS main_class FROM Studentclass GROUP BY std_id;
STD_ID MAIN_class
------ ----------
100 1
200 3
300 4
400 5
500 6
CASE col_1 WHEN 1   THEN 'Right' WHEN NULL THEN 'Wrong' END
--½Ž€å•Case函数 CASE sex WHEN '1' THEN 'ç”? WHEN '2' THEN 'å¥? ELSE 'å…¶ä»–' END --Caseæœçƒ¦å‡½æ•° CASE WHEN sex = '1' THEN 'ç”? WHEN sex = '2' THEN 'å¥? ELSE 'å…¶ä»–' END
--比如è¯ß_¼Œä¸‹é¢˜q™æ®µSQLåQŒä½ æ°¸è¿œæ— æ³•å¾—åˆ°“½W¬äºŒ¾c?#8221;˜q™ä¸ª¾l“æžœ CASE WHEN col_1 IN ( 'a', 'b') THEN '½W¬ä¸€¾c? WHEN col_1 IN ('a') THEN '½W¬äºŒ¾c? ELSE'å…¶ä»–' END
国家åQˆcountryåQ?/td> | 人å£åQˆpopulationåQ?/td> |
ä¸å›½ | 600 |
¾ŸŽå›½ | 100 |
åŠ æ‹¿å¤?/td> | 100 |
英国 | 200 |
法国 | 300 |
日本 | 250 |
德国 | 200 |
墨西�/td> | 50 |
å°åº¦ | 250 |
‹z?/td> | äººå£ |
亚洲 | 1100 |
北美‹z?/td> | 250 |
å…¶ä»– | 700 |
SELECT SUM(population), CASE country WHEN 'ä¸å›½' THEN '亚洲' WHEN 'å°åº¦' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '¾ŸŽå›½' THEN '北美‹z? WHEN 'åŠ æ‹¿å¤? THEN '北美‹z? WHEN '墨西å“? THEN '北美‹z? ELSE 'å…¶ä»–' END FROM Table_A GROUP BY CASE country WHEN 'ä¸å›½' THEN '亚洲' WHEN 'å°åº¦' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '¾ŸŽå›½' THEN '北美‹z? WHEN 'åŠ æ‹¿å¤? THEN '北美‹z? WHEN '墨西å“? THEN '北美‹z? ELSE 'å…¶ä»–' END;
SELECT CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END salary_class, COUNT(*) FROM Table_A GROUP BY CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END;
国家åQˆcountryåQ?/td> | 性别åQˆsexåQ?/td> | 人å£åQˆpopulationåQ?/td> |
ä¸å›½ | 1 | 340 |
ä¸å›½ | 2 | 260 |
¾ŸŽå›½ | 1 | 45 |
¾ŸŽå›½ | 2 | 55 |
åŠ æ‹¿å¤?/td> | 1 | 51 |
åŠ æ‹¿å¤?/td> | 2 | 49 |
英国 | 1 | 40 |
英国 | 2 | 60 |
国家 | �/td> | �/td> |
ä¸å›½ | 340 | 260 |
¾ŸŽå›½ | 45 | 55 |
åŠ æ‹¿å¤?/td> | 51 | 49 |
英国 | 40 | 60 |
SELECT country, SUM( CASE WHEN sex = '1' THEN population ELSE 0 END), --ç”äh€§ähå?/span> SUM( CASE WHEN sex = '2' THEN population ELSE 0 END) --å¥Ïx€§ähå?/span> FROM Table_A GROUP BY country;
CONSTRAINT check_salary CHECK ( CASE WHEN sex = '2' THEN CASE WHEN salary > 1000 THEN 1 ELSE 0 END ELSE 1 END = 1 )
CONSTRAINT check_salary CHECK ( sex = '2' AND salary > 1000 )
USE pubs GO SELECT CASE WHEN price IS NULL THEN 'Unpriced' WHEN price < 10 THEN 'Bargain' WHEN price BETWEEN 10 and 20 THEN 'Average' ELSE 'Gift to impress relatives' END AS Range, Title FROM titles GROUP BY CASE WHEN price IS NULL THEN 'Unpriced' WHEN price < 10 THEN 'Bargain' WHEN price BETWEEN 10 and 20 THEN 'Average' ELSE 'Gift to impress relatives' END, Title ORDER BY CASE WHEN price IS NULL THEN 'Unpriced' WHEN price < 10 THEN 'Bargain' WHEN price BETWEEN 10 and 20 THEN 'Average' ELSE 'Gift to impress relatives' END, Title GO
SQL-92 è¯æ³•
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
Transact-SQL æ‰©å±•è¯æ³•
DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
SQL-92 傿•°
cursor_name
是所定义çš?Transact-SQL æœåŠ¡å™¨æ¸¸æ ‡å¿U°ã€‚cursor_name å¿…é¡»éµä»Žæ ‡è¯†½W¦è§„则。有å…Ïx ‡è¯†ç¬¦è§„则的更多信æ¯ï¼Œè¯·å‚è§ä‹Éç”¨æ ‡è¯†ç¬¦ã€?/font>
INSENSITIVE
å®šä¹‰ä¸€ä¸ªæ¸¸æ ‡ï¼Œä»¥åˆ›å»ºå°†ç”Þp¯¥æ¸¸æ ‡ä½¿ç”¨çš„æ•°æ®çš„ä¸´æ—¶å¤æœ¬ã€‚å¯¹æ¸¸æ ‡çš„æ‰€æœ‰è¯·æ±‚éƒ½ä»?tempdb ä¸çš„该äÍæ—¶è¡¨ä¸å¾—到应½{”ï¼›å› æ¤åQŒåœ¨å¯¹è¯¥æ¸¸æ ‡˜q›è¡Œæå–æ“作时返回的数æ®ä¸ä¸åæ˜ å¯¹åŸºè¡¨æ‰€åšçš„修改åQŒåÆˆä¸”è¯¥æ¸¸æ ‡ä¸å…è®æ€¿®æ”V€‚ä‹Éç”?SQL-92 è¯æ³•æ—Óž¼Œå¦‚æžœçœç•¥ INSENSITIVEåQŒï¼ˆä»ÖM½•用户åQ‰å¯¹åŸø™¡¨æäº¤çš„åˆ é™¤å’Œæ›´æ–°éƒ½åæ˜ 在åŽé¢çš„æå–ä¸ã€?/font>
SCROLL
指定所有的æå–选项åQˆFIRSTã€LASTã€PRIORã€NEXTã€RELATIVEã€ABSOLUTEåQ‰å‡å¯ç”¨ã€‚如果在 SQL-92 DECLARE CURSOR 䏿œªæŒ‡å®š SCROLLåQŒåˆ™ NEXT 是唯一支æŒçš„æå–选项。如果指å®?SCROLLåQŒåˆ™ä¸èƒ½ä¹ŸæŒ‡å®?FAST_FORWARDã€?/font>
select_statement
æ˜¯å®šä¹‰æ¸¸æ ‡ç»“æžœé›†çš„æ ‡å‡?SELECT è¯å¥ã€‚åœ¨æ¸¸æ ‡å£°æ˜Žçš?select_statement 内ä¸å…许使用关键å?COMPUTEã€COMPUTE BYã€FOR BROWSE å’?INTOã€?/font>
如果 select_statement ä¸çš„åå¥ä¸Žæ‰€è¯äh±‚çš„æ¸¸æ ‡ç±»åž‹çš„åŠŸèƒ½å‘生冲çªåQŒåˆ™ Microsoft? SQL Server? éšæ€§åœ°ž®†æ¸¸æ ‡è{æ¢äØ“å¦ä¸€¿U类型。有å…Ïx›´å¤šä¿¡æ¯ï¼Œè¯·å‚è§éšæ€§æ¸¸æ ‡è{æ¢ã€?/font>
READ ONLY
Prevents updates made through this cursor.åœ?UPDATE æˆ?DELETE è¯å¥çš?WHERE CURRENT OF åå¥ä¸ä¸èƒ½å¼•ç”¨æ¸¸æ ‡ã€‚è¯¥é€‰é¡¹æ›¿ä»£è¦æ›´æ–°çš„æ¸¸æ ‡çš„默认功能ã€?/font>
UPDATE [OF column_name [,...n]]
å®šä¹‰æ¸¸æ ‡å†…å¯æ›´æ–°çš„列。如果指å®?OF column_name [,...n] 傿•°åQŒåˆ™åªå…è®æ€¿®æ”ÒŽ‰€åˆ—出的列。如果在 UPDATE 䏿œªæŒ‡å®šåˆ—的列表åQŒåˆ™å¯ä»¥æ›´æ–°æ‰€æœ‰åˆ—ã€?/font>
Transact-SQL æ‰©å±•å‚æ•°
cursor_name
是所定义çš?Transact-SQL æœåŠ¡å™¨æ¸¸æ ‡å¿U°ã€‚cursor_name å¿…é¡»éµä»Žæ ‡è¯†½W¦è§„则。有å…Ïx ‡è¯†ç¬¦è§„则的更多信æ¯ï¼Œè¯·å‚è§ä‹Éç”¨æ ‡è¯†ç¬¦ã€?/font>
LOCAL
æŒ‡å®šè¯¥æ¸¸æ ‡çš„ä½œç”¨åŸŸå¯¹åœ¨å…¶ä¸åˆ›å»ºå®ƒçš„æ‰¹å¤„ç†ã€å˜å‚¨è¿‡½E‹æˆ–触å‘å™¨æ˜¯å±€éƒ¨çš„ã€‚è¯¥æ¸¸æ ‡å称仅在˜q™ä¸ªä½œç”¨åŸŸå†…有效。在批处ç†ã€å˜å‚¨è¿‡½E‹ã€è§¦å‘器或å˜å‚¨è¿‡½E?OUTPUT 傿•°ä¸ï¼Œè¯¥æ¸¸æ ‡å¯ç”±å±€éƒ¨æ¸¸æ ‡å˜é‡å¼•用。OUTPUT 傿•°ç”¨äºŽž®†å±€éƒ¨æ¸¸æ ‡ä¼ 递回调用批处ç†ã€å˜å‚¨è¿‡½E‹æˆ–触å‘器,它们å¯åœ¨å˜å‚¨˜q‡ç¨‹¾lˆæ¢åŽç»™æ¸¸æ ‡å˜é‡æŒ‡æ´¾å‚æ•°ä½¿å…¶å¼•ç”¨æ¸¸æ ‡ã€‚é™¤é?OUTPUT 傿•°ž®†æ¸¸æ ‡ä¼ 递回æ¥ï¼Œå¦åˆ™æ¸¸æ ‡ž®†åœ¨æ‰¹å¤„ç†ã€å˜å‚¨è¿‡½E‹æˆ–触å‘å™¨ç»ˆæ¢æ—¶éšæ€§é‡Šæ”¾ã€‚å¦‚æž?OUTPUT 傿•°ž®†æ¸¸æ ‡ä¼ 递回æ¥ï¼Œæ¸¸æ ‡åœ¨æœ€åŽå¼•用它的å˜é‡é‡Šæ”¾æˆ–¼›Õd¼€ä½œç”¨åŸŸæ—¶é‡Šæ”¾ã€?/font>
GLOBAL
æŒ‡å®šè¯¥æ¸¸æ ‡çš„ä½œç”¨åŸŸå¯¹˜qžæŽ¥æ˜¯å…¨å±€çš„。在ç”Þp¿žæŽ¥æ‰§è¡Œçš„ä»ÖM½•å˜å‚¨˜q‡ç¨‹æˆ–批处ç†ä¸ï¼Œéƒ½å¯ä»¥å¼•ç”¨è¯¥æ¸¸æ ‡åç§°ã€‚è¯¥æ¸¸æ ‡ä»…åœ¨è„±æŽ¥æ—‰™šæ€§é‡Šæ”¾ã€?/font>
说明 如果 GLOBAL å’?LOCAL 傿•°éƒ½æœªæŒ‡å®šåQŒåˆ™é»˜è®¤å€¼ç”± default to local cursor æ•°æ®åº“选项的设¾|®æŽ§åˆ¶ã€‚在 SQL Server 7.0 版ä¸åQŒè¯¥é€‰é¡¹é»˜è®¤ä¸?FALSE 以与 SQL Server 早期版本相匹é…,åœ?SQL Server æ—©æœŸç‰ˆæœ¬ä¸æ‰€æœ‰æ¸¸æ ‡éƒ½æ˜¯å…¨å±€çš„。该选项的默认值在以åŽçš?SQL Server 版本ä¸å¯èƒ½ä¼šæ›´æ”¹ã€‚有å…Ïx›´å¤šä¿¡æ¯ï¼Œè¯·å‚è§è®¾¾|®æ•°æ®åº“选项ã€?/font>
FORWARD_ONLY
æŒ‡å®šæ¸¸æ ‡åªèƒ½ä»Žç¬¬ä¸€è¡Œæ»šåŠ¨åˆ°æœ€åŽä¸€è¡Œã€‚FETCH NEXT æ˜¯å”¯ä¸€å—æ”¯æŒçš„æå–选项。如果在指定 FORWARD_ONLY æ—¶ä¸æŒ‡å®š STATICã€KEYSET å’?DYNAMIC 关键å—ï¼Œåˆ™æ¸¸æ ‡ä½œä¸?DYNAMIC æ¸¸æ ‡˜q›è¡Œæ“作。如æž?FORWARD_ONLY å’?SCROLL 凿œªæŒ‡å®šåQŒé™¤éžæŒ‡å®?STATICã€KEYSET æˆ?DYNAMIC 关键å—,å¦åˆ™é»˜è®¤ä¸?FORWARD_ONLY。STATICã€KEYSET å’?DYNAMIC æ¸¸æ ‡é»˜è®¤ä¸?SCROLL。与 ODBC å’?ADO˜q™ç±»æ•°æ®åº?API ä¸åŒåQŒSTATICã€KEYSET å’?DYNAMIC Transact-SQL æ¸¸æ ‡æ”¯æŒ FORWARD_ONLY。FAST_FORWARD å’?FORWARD_ONLY 是互斥的åQ›å¦‚果指定一个,则ä¸èƒ½æŒ‡å®šå¦ä¸€ä¸ªã€?/p>
STATIC
å®šä¹‰ä¸€ä¸ªæ¸¸æ ‡ï¼Œä»¥åˆ›å»ºå°†ç”Þp¯¥æ¸¸æ ‡ä½¿ç”¨çš„æ•°æ®çš„ä¸´æ—¶å¤æœ¬ã€‚å¯¹æ¸¸æ ‡çš„æ‰€æœ‰è¯·æ±‚éƒ½ä»?tempdb ä¸çš„该äÍæ—¶è¡¨ä¸å¾—到应½{”ï¼›å› æ¤åQŒåœ¨å¯¹è¯¥æ¸¸æ ‡˜q›è¡Œæå–æ“作时返回的数æ®ä¸ä¸åæ˜ å¯¹åŸºè¡¨æ‰€åšçš„修改åQŒåÆˆä¸”è¯¥æ¸¸æ ‡ä¸å…è®æ€¿®æ”V€?/p>
KEYSET
æŒ‡å®šå½“æ¸¸æ ‡æ‰“å¼€æ—Óž¼Œæ¸¸æ ‡ä¸è¡Œçš„æˆå‘˜èµ„æ ¼å’Œ™åºåºå·²ç»å›ºå®šã€‚å¯¹è¡Œè¿›è¡Œå”¯ä¸€æ ‡è¯†çš„é”®é›†å†…¾|®åœ¨ tempdb 内一个称ä¸?keyset 的表ä¸ã€‚å¯¹åŸø™¡¨ä¸çš„éžé”®å€¼æ‰€åšçš„æ›´æ”¹åQˆç”±æ¸¸æ ‡æ‰€æœ‰è€…æ›´æ”ÒŽˆ–由其它用æˆäh交)在用æˆäh»šåŠ¨æ¸¸æ ‡æ—¶æ˜¯å¯è§†çš„。其他用戯‚¿›è¡Œçš„æ’å…¥æ˜¯ä¸å¯è§†çš„(ä¸èƒ½é€šè¿‡ Transact-SQL æœåŠ¡å™¨æ¸¸æ ‡è¿›è¡Œæ’入)。如果æŸè¡Œå·²åˆ 除åQŒåˆ™å¯¹è¯¥è¡Œçš„æå–æ“作ž®†è¿”å›?@@FETCH_STATUS å€?-2ã€‚ä»Žæ¸¸æ ‡å¤–æ›´æ–°é”®å€¼ç±»ä¼égºŽåˆ é™¤æ—§è¡ŒåŽæŽ¥ç€æ’入新行的æ“ä½œã€‚å«æœ‰æ–°å€¼çš„行ä¸å¯è§†åQŒå¯¹å«æœ‰æ—§å€¼çš„行的æå–æ“作ž®†è¿”å›?@@FETCH_STATUS å€?-2。如果通过指定 WHERE CURRENT OF åå¥ç”¨æ¸¸æ ‡å®Œæˆæ›´æ–ŽÍ¼Œåˆ™æ–°å€¼å¯è§†ã€?/p>
DYNAMIC
å®šä¹‰ä¸€ä¸ªæ¸¸æ ‡ï¼Œä»¥åæ˜ åœ¨æ»šåŠ¨æ¸¸æ ‡æ—¶å¯¹¾l“果集内的行所åšçš„æ‰€æœ‰æ•°æ®æ›´æ”V€‚行的数æ®å€¹{€é¡ºåºå’Œæˆå‘˜åœ¨æ¯‹Æ¡æå–æ—¶éƒ½ä¼šæ›´æ”¹ã€‚åŠ¨æ€æ¸¸æ ‡ä¸æ”¯æŒ ABSOLUTE æå–选项ã€?/p>
FAST_FORWARD
指定å¯ç”¨äº†æ€§èƒ½ä¼˜åŒ–çš?FORWARD_ONLYã€READ_ONLY æ¸¸æ ‡ã€‚å¦‚æžœæŒ‡å®?FAST_FORWARDåQŒåˆ™ä¸èƒ½ä¹ŸæŒ‡å®?SCROLL æˆ?FOR_UPDATE。FAST_FORWARD å’?FORWARD_ONLY 是互斥的åQ›å¦‚果指定一个,则ä¸èƒ½æŒ‡å®šå¦ä¸€ä¸ªã€?/p>
READ_ONLY
¼›æ¢é€šè¿‡è¯¥æ¸¸æ ‡è¿›è¡Œæ›´æ–°ã€‚在 UPDATE æˆ?DELETE è¯å¥çš?WHERE CURRENT OF åå¥ä¸ä¸èƒ½å¼•ç”¨æ¸¸æ ‡ã€‚è¯¥é€‰é¡¹æ›¿ä»£è¦æ›´æ–°çš„æ¸¸æ ‡çš„默认功能ã€?/p>
SCROLL_LOCKS
指定¼‹®ä¿é€šè¿‡æ¸¸æ ‡å®Œæˆçš„å®šä½æ›´æ–°æˆ–定ä½åˆ 除å¯ä»¥æˆåŠŸã€‚å½“ž®†è¡Œè¯Õd…¥æ¸¸æ ‡ä»¥ç¡®ä¿å®ƒä»¬å¯ç”¨äºŽä»¥åŽçš„ä¿®æ”ÒŽ—¶åQŒMicrosoft? SQL Server? 会é”定这些行。如果还指定äº?FAST_FORWARDåQŒåˆ™ä¸èƒ½æŒ‡å®š SCROLL_LOCKSã€?/p>
OPTIMISTIC
指定如果行自从被è¯Õd…¥æ¸¸æ ‡ä»¥æ¥å·²å¾—到更斎ͼŒåˆ™é€šè¿‡æ¸¸æ ‡˜q›è¡Œçš„å®šä½æ›´æ–°æˆ–定ä½åˆ 除䏿ˆåŠŸã€‚å½“ž®†è¡Œè¯Õd…¥æ¸¸æ ‡æ—?SQL Server ä¸é”定行。相å,SQL Server 使用 timestamp 列值的比较åQŒæˆ–者如果表没有 timestamp åˆ—åˆ™ä½¿ç”¨æ ¡éªŒå€û|¼Œä»¥ç¡®å®šå°†è¡Œè¯»å…¥æ¸¸æ ‡åŽæ˜¯å¦å·²ä¿®æ”¹è¯¥è¡Œã€‚如果已修改该行åQŒå°è¯•è¿›è¡Œçš„å®šä½æ›´æ–°æˆ–定ä½åˆ 除将å¤ÞpÓ|。如果还指定äº?FAST_FORWARDåQŒåˆ™ä¸èƒ½æŒ‡å®š OPTIMISTICã€?/p>
TYPE_WARNING
æŒ‡å®šå¦‚æžœæ¸¸æ ‡ä»Žæ‰€è¯äh±‚çš„ç±»åž‹éšæ€§è{æ¢äØ“å¦ä¸€¿U类型,则给客户端å‘é€è¦å‘Šæ¶ˆæ¯ã€?/p>
select_statement
æ˜¯å®šä¹‰æ¸¸æ ‡ç»“æžœé›†çš„æ ‡å‡?SELECT è¯å¥ã€‚åœ¨æ¸¸æ ‡å£°æ˜Žçš?select_statement 内ä¸å…许使用关键å?COMPUTEã€COMPUTE BYã€FOR BROWSE å’?INTOã€?/p>
如果 select_statement 内的åå¥ä¸Žæ‰€è¯äh±‚çš„æ¸¸æ ‡ç±»åž‹å†²½H,SQL Server ž®†æ¸¸æ ‡é𿀧è{æ¢æˆå¦ä¸€¿U类型。有å…Ïx›´å¤šä¿¡æ¯ï¼Œè¯·å‚è§éšæ€§æ¸¸æ ‡è{æ¢ã€?/p>
UPDATE [OF column_name [,...n]]
å®šä¹‰æ¸¸æ ‡å†…å¯æ›´æ–°çš„列。如果æä¾›äº† OF column_name [,...n]åQŒåˆ™åªå…è®æ€¿®æ”¹åˆ—出的列。如果在 UPDATE 䏿œªæŒ‡å®šåˆ—的列表åQŒé™¤éžæŒ‡å®šäº† READ_ONLY òq¶å‘选项åQŒå¦åˆ™æ‰€æœ‰åˆ—å‡å¯æ›´æ–°ã€?/p>
注释
DECLARE CURSOR 定义 Transact-SQL æœåŠ¡å™¨æ¸¸æ ‡çš„ç‰ÒŽ€§ï¼Œä¾‹å¦‚æ¸¸æ ‡çš„æ»šåŠ¨è¡Œä¸ºå’Œç”¨äºŽç”Ÿæˆæ¸¸æ ‡å¯¹å…¶˜q›è¡Œæ“作的结果集的查询。OPEN è¯å¥å¡«å……¾l“果集,FETCH 从结果集˜q”回行。CLOSE è¯å¥é‡Šæ”¾ä¸Žæ¸¸æ ‡å…³è”的当剾l“果集。DEALLOCATE è¯å¥é‡Šæ”¾æ¸¸æ ‡æ‰€ä½¿ç”¨çš„资æºã€?/p>
DECLARE CURSOR è¯å¥çš„第一¿Uæ ¼å¼ä‹Éç”?SQL-92 è¯æ³•å£°æ˜Žæ¸¸æ ‡è¡ŒäØ“ã€‚DECLARE CURSOR çš„ç¬¬äºŒç§æ ¼å¼ä½¿ç”¨ Transact-SQL 扩展åQŒä‹É您得以ä‹É用在 ODBCã€ADO å’?DB-Library的数æ®åº“ API æ¸¸æ ‡å‡½æ•°ä¸çš„ç›¸åŒæ¸¸æ ‡¾cÕdž‹å®šä¹‰æ¸¸æ ‡ã€?/p>
ä¸èƒ½æ·äh·†˜q™ä¸¤¿Uæ ¼å¼ã€‚如果在 CURSOR 关键å—çš„å‰é¢æŒ‡å®š SCROLL æˆ?INSENSITIVE 关键å—,则ä¸èƒ½åœ¨ CURSOR å’?FOR select_statement 关键å—之间ä‹É用ä“Q何关键å—。如果在 CURSOR å’?FOR select_statement 关键å—之间指定ä“Q何关键å—åQŒåˆ™ä¸èƒ½åœ?CURSOR 关键å—çš„å‰é¢æŒ‡å®š SCROLL æˆ?INSENSITIVEã€?/p>
如果使用 Transact-SQL è¯æ³•çš?DECLARE CURSOR 䏿Œ‡å®?READ_ONLYã€OPTIMISTIC æˆ?SCROLL_LOCKSåQŒåˆ™é»˜è®¤è®„¡½®å¦‚下åQ?
如果 SELECT è¯å¥ä¸æ”¯æŒæ›´æ–ŽÍ¼ˆæƒé™ä¸å¤ŸåQŒè®¿é—®çš„˜qœç¨‹è¡¨ä¸æ”¯æŒæ›´æ–°åQŒç‰½{‰ï¼‰åQŒåˆ™æ¸¸æ ‡æ˜?READ_ONLYã€?/p>
STATIC å’ŒFAST_FORWARD æ¸¸æ ‡é»˜è®¤ä¸?READ_ONLYã€?/p>
DYNAMIC å’?KEYSET æ¸¸æ ‡é»˜è®¤ä¸?OPTIMISTICã€?
æ¸¸æ ‡åç§°åªèƒ½ç”±å…¶å®?Transact-SQL è¯å¥å¼•用åQŒä¸èƒ½ç”±æ•°æ®åº?API å‡½æ•°å¼•ç”¨ã€‚ä¾‹å¦‚ï¼Œåœ¨å£°æ˜Žæ¸¸æ ‡åŽåQŒä¸èƒ½ä»Ž OLE DBã€ODBCã€ADO æˆ?DB-Library å‡½æ•°æˆ–æ–¹æ³•å¼•ç”¨æ¸¸æ ‡å¿U°ã€‚æ¸¸æ ‡è¡Œä¸èƒ½é€šè¿‡ API æå–函数或方法æå–,而åªèƒ½ç”± Transact-SQL FETCH è¯å¥æå–ã€?/p>
åœ¨å£°æ˜Žæ¸¸æ ‡åŽåQŒå¯ä½¿ç”¨ä¸‹åˆ—¾pÈ»Ÿå˜å‚¨˜q‡ç¨‹¼‹®å®šæ¸¸æ ‡çš„特性ã€?/p>
¾pÈ»Ÿå˜å‚¨˜q‡ç¨‹ æè¿°
sp_cursor_list ˜q”回当å‰åœ¨è¿žæŽ¥ä¸Šå¯è§†çš„æ¸¸æ ‡åˆ—表åŠå…¶ç‰¹æ€§ã€?
sp_describe_cursor æè¿°æ¸¸æ ‡ç‰ÒŽ€§ï¼Œæ¯”如是媘q›æ¸¸æ ‡è¿˜æ˜¯æ»šåŠ¨æ¸¸æ ‡ã€?
sp_describe_cursor_columns æè¿°æ¸¸æ ‡¾l“果集ä¸çš„列的特性ã€?
sp_describe_cursor_tables æè¿°æ¸¸æ ‡æ‰€è®‰K—®çš„基表ã€?
å˜é‡å¯ä½œä¸ºå£°æ˜Žæ¸¸æ ‡çš„ select_statement çš„ä¸€éƒ¨åˆ†ä½¿ç”¨ã€‚ç„¶è€Œï¼Œåœ¨æ¸¸æ ‡å£°æ˜Žä¹‹åŽå¯¹é‚£äº›å˜é‡çš„æ›´æ”¹å°†ä¸ä¼šå¯Òޏ¸æ ‡çš„æ“ä½œäº§ç”Ÿå½±å“ã€?/p>
æƒé™
默认情况下,ž®?DECLARE CURSOR æƒé™æŽˆäºˆå¯Òޏ¸æ ‡ä¸æ‰€ä½¿ç”¨çš„视图ã€è¡¨å’Œåˆ—æœ?SELECT æƒé™çš„ä“Q何用戗÷€?/p>
½CÞZ¾‹
A. 使用½Ž€å•æ¸¸æ ‡å’Œè¯æ³•
æ‰“å¼€è¯¥æ¸¸æ ‡æ—¶æ‰€ç”Ÿæˆçš„结果集包括 pubs æ•°æ®åº“çš„ authors 表ä¸çš„æ‰€æœ‰è¡Œå’Œåˆ—。å¯ä»¥æ›´æ–°è¯¥æ¸¸æ ‡åQŒå¯¹è¯¥æ¸¸æ ‡æ‰€åšçš„æ‰€æœ‰æ›´æ–°å’Œåˆ 除å‡åœ¨æå–ä¸è¡¨çŽ°å‡ºæ¥ã€‚å› ä¸ºæ²¡æŒ‡å®š SCROLL 选项åQŒFETCH NEXT 是唯一å¯ç”¨çš„æå–选项ã€?/p>
DECLARE authors_cursor CURSOR
FOR SELECT * FROM authors
OPEN authors_cursor
FETCH NEXT FROM authors_cursor
B. ä½¿ç”¨åµŒå¥—æ¸¸æ ‡ç”ŸæˆæŠ¥è¡¨è¾“å‡º
下例昄¡¤ºå¦‚ä½•åµŒå¥—æ¸¸æ ‡ä»¥ç”Ÿæˆå¤æ‚çš„æŠ¥è¡¨ã€‚äØ“æ¯ä¸ªä½œè€…å£°æ˜Žå†…éƒ¨æ¸¸æ ‡ã€?/p>
SET NOCOUNT ON
DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
@message varchar(80), @title varchar(80)
PRINT "-------- Utah Authors report --------"
DECLARE authors_cursor CURSOR FOR
SELECT au_id, au_fname, au_lname
FROM authors
WHERE state = "UT"
ORDER BY au_id
OPEN authors_cursor
FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT " "
SELECT @message = "----- Books by Author: " +
@au_fname + " " + @au_lname
PRINT @message
-- Declare an inner cursor based
-- on au_id from the outer cursor.
DECLARE titles_cursor CURSOR FOR
SELECT t.title
FROM titleauthor ta, titles t
WHERE ta.title_id = t.title_id AND
ta.au_id = @au_id -- Variable value from the outer cursor
OPEN titles_cursor
FETCH NEXT FROM titles_cursor INTO @title
IF @@FETCH_STATUS <> 0
PRINT " <<No Books>>"
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @message = " " + @title
PRINT @message
FETCH NEXT FROM titles_cursor INTO @title
END
CLOSE titles_cursor
DEALLOCATE titles_cursor
-- Get the next author.
FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname
END
CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
-------- Utah Authors report --------
----- Books by Author: Anne Ringer
The Gourmet Microwave
Is Anger the Enemy?
----- Books by Author: Albert Ringer
Is Anger the Enemy?
Life Without Fear
CREATE DATABASE student
2.å¦‚ä½•åˆ é™¤æ•°æ®åº?/p>
DROP DATABASE student
3.如何备䆾数æ®åº“到¼‚盘文äšg
BACKUP DATABASE student to disk=´c:\1234.bak´
4.如何从ç£ç›˜æ–‡ä»¶è¿˜åŽŸæ•°æ®åº“
RESTORE DATABASE studnet FROM DISK = ´c:\1234.bak´
5.æ€Žæ ·åˆ›å¾è¡¨ï¼Ÿ
CREATE TABLE Students (
ID int IDENTITY ( 1, 1), --è‡ªå¢žå—æ®µ,基数1,æ¥é•¿1
StudentID char (4) NOT NULL ,
Name char (10) NOT NULL ,
Age int NULL ,
Birthday datetime NULL,
CONSTRAINT PK_Students PRIMARY KEY (StudentID) --讄¡½®ä¸»é”®
)
CREATE TABLE Subjects (
ID int IDENTITY ( 1, 1), --è‡ªå¢žå—æ®µ,基数1,æ¥é•¿1
ClassID char (4) NOT NULL ,
ClassName char (10) NOT NULL,
CONSTRAINT PK_Subjects PRIMARY KEY (ClassID) --讄¡½®ä¸»é”®
)
CREATE TABLE Scores (
ID int IDENTITY ( 1, 1), --è‡ªå¢žå—æ®µ,基数1,æ¥é•¿1
StudentID char (4) NOT NULL ,
ClassID char (4) NOT NULL ,
Score float NOT NULL,
CONSTRAINT FK_Scores_Students FOREIGN KEY (StudentID) REFERENCES Students(StudentID), --讄¡½®å¤–é”®
CONSTRAINT FK_Scores_Subjects FOREIGN KEY (ClassID) REFERENCES Subjects(ClassID), --讄¡½®å¤–é”®
CONSTRAINT PK_Scores PRIMARY KEY (StudentID,ClassID) --讄¡½®ä¸»é”®
)
6.æ€Žæ ·åˆ é™¤è¡¨ï¼Ÿ
DROP TABLE Students
7.æ€Žæ ·åˆ›å¾è§†å›¾åQ?/p>
CREATE VIEW s_s_s
AS
SELECT Students.Name, Subjects.ClassName, Scores.Score
FROM Scores INNER JOIN
Students ON Scores.StudentID = Students.StudentID INNER JOIN
Subjects ON Scores.ClassID = Subjects.ClassID
8.æ€Žæ ·åˆ é™¤è§†å›¾åQ?/p>
DROP VIEW s_s_s
9.如何创å¾å˜å‚¨˜q‡ç¨‹?
CREATE PROCEDURE GetStudent
@age INT,
@birthday DATETIME
AS
SELECT *
FROM students
WHERE Age = @age AND Birthday = @birthday
GO
10.å¦‚ä½•åˆ é™¤å˜å‚¨˜q‡ç¨‹?
DROP PROCEDURE GetStudent
11.如何创å¾è§¦å‘å™?
CREATE TRIGGER reminder
ON Students
FOR INSERT, UPDATE, DELETE
AS
EXEC master..xp_sendmail ´MaryM´,
´Don´´t forget to print a report for the distributors.´
GO
12.å¦‚ä½•åˆ é™¤è§¦å‘å™?
DROP TRIGGER reminder
13.如何创å¾ç´¢å¼•?
CREATE UNIQUE INDEX IX_Students ON Students (Name)
14.å¦‚ä½•åˆ é™¤ç´¢å¼•?
DROP INDEX Students.IX_Students
15.æ€Žæ ·¾l™è¡¨æ·ÕdŠ å—æ®µåQ?/p>
ALTER TABLE Students ADD Address varchar (50) NULL
16.æ€Žæ ·åˆ é™¤è¡¨ä¸æŸä¸ªå—段åQ?/p>
ALTER TABLE Students DROP COLUMN Address
17.如何讄¡½®åˆ—çš„æ ‡è¯†å±žæ€?
没找到办�/p>
18.如何åŽÀLŽ‰åˆ—çš„æ ‡è¯†å±žæ€?
没有扑ֈ°å¥½çš„æ–ÒŽ³•,åªèƒ½æ˜¯å…ˆæ·ÕdР䏀åˆ?ç„¶åŽæŠŠæ ‡è¯†åˆ—çš„å€¼æ›´æ–°åˆ°æ–°åŠ å…¥çš„åˆ?åˆ é™¤æ ‡è¯†åˆ?å†ç”¨ä¸Žæ ‡è¯†åˆ—相åŒçš„åå—ç±»åž‹æ·»åŠ ä¸€åˆ?用å‰é¢åŠ å…¥çš„åˆ—æ›´æ–°è¯¥åˆ?å¦‚æžœè¯¥æ ‡è¯†åˆ—æ˜¯å…¶ä»–è¡¨çš„å¤–é”?˜q˜è¦å…ˆåˆ 除外键约æ?很麻çƒ?è°æœ‰å¥½çš„办法,˜q˜è¯·å‘Šè¯‰æˆ?
19.如何é‡è®¾æ ‡è¯†åˆ—çš„æ ‡è¯†¿Uå?
DBCC CHECKIDENT (Student, RESEED, 1)
20.æ€Žæ ·¾l™è¡¨åŠ ä¸Šä¸»é”®åQ?/p>
ALTER TABLE Scores ADD CONSTRAINT PK_Scores PRIMARY KEY (StudentID,ClassID)
21.æ€Žæ ·åˆ é™¤è¡¨çš„ä¸»é”®åQ?/p>
ALTER TABLE Scores DROP CONSTRAINT PK_Scores
22.æ€Žæ ·¾l™è¡¨æ·ÕdŠ ä¸€ä¸ªå¤–é”®ï¼Ÿ
ALTER TABLE Scores ADD CONSTRAINT FK_Scores_Students FOREIGN KEY (StudentID) REFERENCES Students (StudentID) ON DELETE CASCADE
23.æ€Žæ ·åˆ é™¤è¡¨çš„ä¸€ä¸ªå¤–é”®ï¼Ÿ
ALTER TABLE Scores DROP CONSTRAINT FK_Scores_Students
24.æ€Žæ ·¾l™å—ŒDµåŠ ä¸ŠCHECK¾U¦æŸåQ?/p>
ALTER TABLE Students ADD CONSTRAINT CK_Students CHECK (Age > 0)
25.æ€Žæ ·åŽÀLމ嗿®µä¸Šçš„CHECK¾U¦æŸåQ?/p>
ALTER TABLE Students DROP CONSTRAINT CK_Students
26.æ€Žæ ·¾l™å—ŒDµè®¾¾|®é»˜è®¤å€û|¼Ÿ
ALTER TABLE Students ADD CONSTRAINT DF_Students_Age DEFAULT (18) FOR Age
27.æ€Žæ ·¿UÕd޻嗿®µçš„默认å€û|¼Ÿ
ALTER TABLE Students DROP CONSTRAINT DF_Students_Age
28.ä¿®æ”¹å—æ®µçš„类型åŠéžç©º¾U¦æŸ
ALTER TABLE Students ALTER COLUMN Age char (10) null
ALTER TABLE Students ALTER COLUMN Age int not null
指定å½?Transact-SQL è¯å¥äº§ç”Ÿ˜q行旉™”™è¯¯æ—¶åQŒMicrosoft® SQL Server™ 是å¦è‡ªåŠ¨å›žæ»šå½“å‰äº‹åŠ¡ã€?/p>
SET XACT_ABORT { ON | OFF }
å½?SET XACT_ABORT ä¸?ON æ—Óž¼Œå¦‚æžœ Transact-SQL è¯å¥äº§ç”Ÿ˜q行旉™”™è¯¯ï¼Œæ•´ä¸ªäº‹åŠ¡ž®†ç»ˆæ¢åÆˆå›žæ»šã€‚äØ“ OFF æ—Óž¼Œåªå›žæ»šäñ”生错误的 Transact-SQL è¯å¥åQŒè€Œäº‹åС将¾l§ç®‹˜q›è¡Œå¤„ç†ã€‚ç¼–è¯‘é”™è¯¯ï¼ˆå¦‚è¯æ³•错误)ä¸å— SET XACT_ABORT 的媄å“ã€?/p>
对于大多æ•?OLE DB æä¾›½E‹åºåQˆåŒ…æ‹?SQL ServeråQ‰ï¼Œéšæ€§æˆ–æ˜‘Ö¼äº‹åŠ¡ä¸çš„æ•°æ®ä¿®æ”¹è¯å¥å¿…é¡»ž®?XACT_ABORT 讄¡½®ä¸?ON。唯一ä¸éœ€è¦è¯¥é€‰é¡¹çš„æƒ…冉|˜¯æä¾›½E‹åºæ”¯æŒåµŒå¥—事务时。有å…Ïx›´å¤šä¿¡æ¯ï¼Œè¯·å‚è§?a href="javascript:hhobj_1.Click()">åˆ†å¸ƒå¼æŸ¥è¯?/a>å’?a href="javascript:hhobj_2.Click()">分布å¼äº‹åŠ?/a>ã€?
SET XACT_ABORT 的设¾|®æ˜¯åœ¨æ‰§è¡Œæˆ–˜q行时设¾|®ï¼Œè€Œä¸æ˜¯åœ¨åˆ†æžæ—¶è®¾¾|®ã€?/p>
䏋例坯D‡´åœ¨å«æœ‰å…¶å®?Transact-SQL è¯å¥çš„事务ä¸å‘生˜qå外键错误。在½W¬ä¸€ä¸ªè¯å¥é›†ä¸äñ”生错误,但其它è¯å¥å‡æˆåŠŸæ‰§è¡Œä¸”äº‹åŠ¡æˆåŠŸæäº¤ã€‚在½W¬äºŒä¸ªè¯å¥é›†ä¸ï¼ŒSET XACT_ABORT 讄¡½®ä¸?ONã€‚è¿™å¯ÆD‡´è¯å¥é”™è¯¯ä½¿æ‰¹å¤„熾lˆæ¢åQŒåƈ使事务回滚ã€?
CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO
SET XACT_ABORT ON
GO
BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO
/* Select shows only keys 1 and 3 added.
Key 2 insert failed and was rolled back, but
XACT_ABORT was OFF and rest of transaction
succeeded.
Key 5 insert error with XACT_ABORT ON caused
all of the second transaction to roll back. */
SELECT *
FROM t2
GO
DROP TABLE t2
DROP TABLE t1
GO
4.delete from tablea & truncate table tablea的区�/span>
truncateè¯å¥æ‰§è¡Œé€Ÿåº¦å¿?/span>,å 资æºå°‘,òq¶ä¸”åªè®°å½•é¡µåˆ é™¤çš„æ—¥å¿—ï¼›
deleteå¯Òޝæ¡è®°å½•çš„åˆ é™¤å‡éœ€è¦è®°å½•æ—¥å¿?/span>
SQLServer
url=jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hagov
drive=com.microsoft.jdbc.sqlserver.SQLServerDriver
username=sa
password=sa
dialect=org.hibernate.dialect.SQLServerDialect