本文將為您介紹在SQL Server數(shù)據(jù)庫(kù)中使用一個(gè)語(yǔ)句塊實(shí)現(xiàn)多條語(yǔ)句插入的方法,供您參考,希望對(duì)您能夠有所幫助。
我們?cè)谌粘2僮髦校獠涣藢?duì)數(shù)據(jù)庫(kù)的某張表,一次性的要插入多條記錄,但是首先想到的就是復(fù)制,粘帖N多重復(fù)的INSERT INTO 語(yǔ)句,萬(wàn)一某一個(gè)少了一個(gè)分號(hào),或多個(gè)逗號(hào)之類(lèi)的,產(chǎn)生錯(cuò)誤,要找起來(lái)可就費(fèi)盡了,既浪費(fèi)時(shí)間,又耽誤工作。
除了上面所說(shuō)的方法外,其實(shí)還有二中方法,相比較起來(lái)要比之前那個(gè)要簡(jiǎn)潔。
首先是之前那個(gè)方法:
第二種方法,使用UNION ALL來(lái)進(jìn)行插入操作:
是不是要比第一種方法簡(jiǎn)單點(diǎn),據(jù)說(shuō)要比第一種要快!
第三種方法就有點(diǎn)特別了,是SQL Server2008特有的,所以,如果你不是SQL Server2008,就不能使用這種方法了,所以趕快升級(jí)吧!體驗(yàn)一下SQL Server2008給我們帶了的好處。
INSERT INTO MyTable(ID,NAME)003'),(8,'004'),(9,'005')
如果需要查看SQL Server 數(shù)據(jù)庫(kù)中的事務(wù)日志,有什么方法呢?下面將為您介紹使用用sql語(yǔ)句dbcc log查看的方法,供您參考,希望對(duì)您有所啟迪。
1)用系統(tǒng)函數(shù)
SELECT allocunitname,operation,[RowLog Contents 0] as r0,[RowLog Contents 1] as r1FROM::Fn_dblog(null,null)where allocunitname like'dbo.TArea%'and operation in('LOP_INSERT_ROWS','LOP_DELETE_ROWS')
2)用DBCC
DBCC log('hrdb', TYPE=2)
dbcc log(dbname,4) --(n=0,1,2,3,4)
1 - 更多信息plus flags, tags, row length
2 - 非常詳細(xì)的信息plus object name, index name,page id, slot id
3 - 每種操作的全部信息
4 - 每種操作的全部信息加上該事務(wù)的16進(jìn)制信息
sql server中,如果想知道有哪些語(yǔ)句是執(zhí)行效率不高的,應(yīng)該如何查看呢?下面就將為您介紹sql server中如何查看執(zhí)行效率不高的語(yǔ)句,供您參考。
在測(cè)量功能時(shí),先以下命令清除sql server的緩存
dbcc freeProcCache
在點(diǎn)擊某個(gè)按鈕,執(zhí)行完后,再執(zhí)行下面語(yǔ)句,就可以知道系統(tǒng)運(yùn)行什么Sql和多少次了,其主要慢語(yǔ)句是那些了;
SELECT creation_time N'語(yǔ)句編譯時(shí)間'
,last_execution_time N'上次執(zhí)行時(shí)間'
,total_physical_reads N'物理讀取總次數(shù)'
,total_logical_reads/execution_count N'每次邏輯讀次數(shù)'
,total_logical_reads N'邏輯讀取總次數(shù)'
,total_logical_writes N'邏輯寫(xiě)入總次數(shù)'
,execution_count N'執(zhí)行次數(shù)'
,total_worker_time/1000 N'所用的CPU總時(shí)間ms'
,total_elapsed_time/1000 N'總花費(fèi)時(shí)間ms'
,(total_elapsed_time / execution_count)/1000 N'平均時(shí)間ms'
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) N'執(zhí)行語(yǔ)句'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
where SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) not like '%fetch%'
ORDER BY total_elapsed_time / execution_count DESC;
SELECT語(yǔ)句的執(zhí)行順序大家比較少關(guān)注,下面將為您詳細(xì)介紹SQL語(yǔ)句中SELECT語(yǔ)句的執(zhí)行順序,供您參考,希望對(duì)您能夠有所幫助。
SELECT語(yǔ)句的執(zhí)行的邏輯查詢處理步驟:
(8)SELECT (9)DISTINCT
(11)<TOP_specification> <select_list>
(1)FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE | ROLLUP}
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
每個(gè)步驟產(chǎn)生一個(gè)虛擬表,該虛擬表被用作下一個(gè)步驟的輸入。只有最后一步生成的表返回給調(diào)用者。如
果沒(méi)有某一子句,則跳過(guò)相應(yīng)的步驟。
1. FROM:對(duì)FROM子句中的前兩個(gè)表執(zhí)行笛卡爾積,生成虛擬表VT1。
2. ON:對(duì)VT1應(yīng)用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。
3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行將作為外部行添加到VT2,生成VT3。
如果FROM子句包含兩個(gè)以上的表,則對(duì)上一個(gè)聯(lián)接生成的結(jié)果表和下一個(gè)表重復(fù)執(zhí)行步驟1到步驟3,直到
處理完所有的表為止。
4. 對(duì)VT3應(yīng)用WHERE篩選器。只有使<where_condition>為T(mén)RUE的行才被插入VT4。
5. GROUP BY:按GROUP BY 子句中的列列表對(duì)VT4中的行分組,生成VT5。
6. CUBE|ROLLUP:把超組插入VT5,生成VT6。
7. HAVING:對(duì)VT6應(yīng)用HAVING篩選器。只有使<having_condition>為T(mén)RUE的組才會(huì)被插入VT7。
8. SELECT:處理SELECT列表,產(chǎn)生VT8。
9. DISTINCT:將重復(fù)的行從VT8中移除,產(chǎn)生VT9。
10. ORDER BY:將VT9中的行按ORDER BY子句中的列列表排序,生成一個(gè)有表(VC10)。
11. TOP:從VC10的開(kāi)始處選擇指定數(shù)量或比例的行,生成表VT11,并返回給調(diào)用者。
聯(lián)系客服