文 章導(dǎo)航 SQL Server 2005 學(xué)習(xí)筆記系列文章導(dǎo)航 (存儲過程,視頻,索引,Clr,各種工具使用)
這篇文章是上篇 SQl使用方法總結(jié) 的延續(xù)篇
1.當(dāng)很多在共用你自己的數(shù)據(jù)時,時不時的會報這種錯誤“已超過了鎖請求超時時段”
直接把下在面的存儲過程 放到你的Master數(shù)據(jù)庫執(zhí)行一下就可以了


set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER Proc [ dbo ] . [ Sp_KillAllProcessInDB ] @DbName VarChar ( 100 ) as if db_id ( @DbName ) = Null begin Print ' DataBase dose not Exist ' end else Begin Declare @spId Varchar ( 30 ) DECLARE TmpCursor CURSOR FOR Select ' Kill ' + convert ( Varchar , spid) as spId from master..SysProcesses where db_Name (dbID) = @DbName and spId <> @@SpId and dbID <> 0 OPEN TmpCursor FETCH NEXT FROM TmpCursor INTO @spId WHILE @@FETCH_STATUS = 0 BEGIN Exec ( @spId ) FETCH NEXT FROM TmpCursor INTO @spId END CLOSE TmpCursor DEALLOCATE TmpCursor end
這個時候如果再有這種情況 出現(xiàn)只要你執(zhí)行一下存儲過程就行了如例子
2.如果修改數(shù)據(jù)的架構(gòu)
--'guest.Table_1'架構(gòu)名+(表名,視頻,存儲過程),新架構(gòu)名,
EXEC
SP_ChangeObjectOwner
'guest.Table_1'
,
'dbo'
|
3.如果安裝時選擇的windows驗證方法,怎么修改為Windows驗證和登錄用戶驗證模式?


/* 標(biāo)題:更改登錄用戶驗證方式 作者:蘇飛 時間:2011-09-25 地點:鄭州 */ /* 登錄用戶的驗證方式一般是在 SQL Server 2005 安裝時被確定的。如果需要改變登錄用 戶的驗證方式,只可以通過 SQL Server Configuration Manager 改變服務(wù)器的驗證方式。改 變登錄用戶的驗證方式的步驟如下: 1、通過"開始"/"程序"/"Microsoft SQL Server 2005"/"SQL Server Management Studio"菜單 打開SQL Server Management Studio 工具。 2、通過"連接到服務(wù)器"對話框連接到需要改變登錄用戶驗證方式的 SQL Server 2005 服務(wù)器。 3、連接正確后,SQL Server Management Studio 中的"對象資源管理器"版面將出現(xiàn)連接的服務(wù) 器。選中這個服務(wù)器,單擊鼠標(biāo)右鍵,選擇"屬性"菜單命令。 4、選擇"服務(wù)器屬性"對話框中的"選擇頁"版面內(nèi)的"安全性"頁面。 5、在"服務(wù)器身份驗證"框架內(nèi),重新選擇登錄用戶的驗證方式。選擇完成后單擊"確定"按鈕, 這時會彈出"SQL Server Management Studio"提示框,提示重新啟動 SQL Server后做作的更改 才會生效。 6、單擊"SQL Server Management Studio"提示框中的"確定"按鈕,重新啟動 SQL Server,即可 更改登錄用戶的驗證方式。 */
4.SQl中如何處理Nvarchar數(shù)字排序問題
select top 10 * from 表名 order by cast ( Ltrim (字段名) as int ) desc
5.時間格式轉(zhuǎn)化


-- 日期轉(zhuǎn)換參數(shù) select CONVERT ( varchar , getdate (), 120 ) -- 2009-03-15 15:10:02 select replace ( replace ( replace ( CONVERT ( varchar , getdate (), 120 ), ' - ' , '' ), ' ' , '' ), ' : ' , '' ) -- 20090315151201 select CONVERT ( varchar ( 12 ) , getdate (), 111 ) -- 2009/03/15 select CONVERT ( varchar ( 12 ) , getdate (), 112 ) -- 20090315 select CONVERT ( varchar ( 12 ) , getdate (), 102 ) -- 2009.03.15 select CONVERT ( varchar ( 12 ) , getdate (), 108 ) -- 15:13:26 其它我不常用的日期格式轉(zhuǎn)換方法: select CONVERT ( varchar ( 12 ) , getdate (), 101 ) -- 03/15/2009 select CONVERT ( varchar ( 12 ) , getdate (), 103 ) -- 15/03/2009 select CONVERT ( varchar ( 12 ) , getdate (), 104 ) -- 15.03.2009 select CONVERT ( varchar ( 12 ) , getdate (), 105 ) -- 15-03-2009 select CONVERT ( varchar ( 12 ) , getdate (), 106 ) -- 15 03 2009 select CONVERT ( varchar ( 12 ) , getdate (), 107 ) -- 15, 2009 select CONVERT ( varchar ( 12 ) , getdate (), 109 ) -- 03 15 2009 select CONVERT ( varchar ( 12 ) , getdate (), 110 ) -- 03-15-2009 select CONVERT ( varchar ( 11 ) , getdate (), 113 ) -- 15 03 2009 select CONVERT ( varchar ( 12 ) , getdate (), 114 ) -- 15:15:55:717
6.兩個時間的運算
DATEDIFF ( minute , 時間, getdate ())
第一個參數(shù)可以是下列任意一個
年 yy, yyyy 季度 qq, q 月 mm, m 年中的日 dy, y 日 dd, d 周 wk, ww 星期 dw, w 小時 hh 分鐘 mi, n 秒 ss, s 毫秒 ms 微妙 mcs 納秒 ns
例子
ELECT DATEDIFF ( day , ' 2008-12-29 ' , ' 2008-12-30 ' )
結(jié)果是1
ELECT DATEDIFF ( day , ' 2008-12-30 ' , ' 2008-12-29 ' )
結(jié)果是-1
7.相同結(jié)構(gòu)表去重復(fù)后進行復(fù)制
insert into 新表名select DomainInFo_FIp.D_Domain,源表名.D_ID,源表名.D_IP,源表名.stat from 源表名
inner join ( select min (D_ID) D_ID, distinct (D_Domain) as D_Domain from 源表名) TempTab on 源表名.D_ID = TempTab.D_ID
8.一個取一張表中域名第一個“.”之前部分,并寫入另外一張表的游標(biāo)實現(xiàn)
declare @D_Domain nvarchar ( 200 ); Declare Mycursor cursor for select D_Domain FROM dbo.DomainInFo_FIp Open Mycursor Fetch next from Mycursor into @D_Domain -- 開始抓數(shù)據(jù) while @@FETCH_STATUS = 0 begin set @D_Domain =Left ( @D_Domain , Charindex ( ' . ' , @D_Domain ) - 1 ) if ( Len ( @D_Domain ) > 0 and @D_Domain <> ' www ' ) begin insert into dbo.DomainInFo_FIp_log (D_Domain) values ( @D_Domain ) end Fetch next from Mycursor into @D_Domain end Close Mycursor -- 關(guān)閉游標(biāo) Deallocate Mycursor -- 刪除游標(biāo)
9.計算一表中某個字段的重復(fù)次數(shù),游標(biāo)實現(xiàn)
declare @D_Domain nvarchar ( 200 ); declare @count int ; Declare Mycursor cursor for select D_Domain FROM dbo.DomainInFo_FIp_log Open Mycursor Fetch next from Mycursor into @D_Domain -- 開始抓數(shù)據(jù) while @@FETCH_STATUS = 0 begin select @count = count ( * ) from DomainInFo_FIp_log where D_Domain = @D_Domain update DomainInFo_FIp_log set numindex = @count where D_Domain = @D_Domain Fetch next from Mycursor into @D_Domain end Close Mycursor -- 關(guān)閉游標(biāo) Deallocate Mycursor -- 刪除游標(biāo)
10.Replace函數(shù)的使用方法
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' = ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' < ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' - ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' ~ ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' ] ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' [ ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' $ ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' { ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' } ' , '' )
update dbo.DomainInFo_FIp set D_Domain = Replace (D_Domain, ' · ' , '' )
11.Substring函數(shù)與Len以及Left的配合使用(字段D_Domain值第一個字符是點的就清除這個點)
update dbo.DomainInFo_FIp set D_Domain = Substring (D_Domain, 2 , Len (D_Domain)) where Left (D_Domain, 1 ) = ' . '
12.一個實現(xiàn)怎么樣查詢IP所在段的函數(shù)代碼如下
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER FUNCTION [ dbo ] . [ GetIP ] ( @ip varchar ( 20 )) RETURNS varchar ( 20 ) AS BEGIN declare @IPre varchar ( 20 ) SET @IPre = '' select @IPre = right ( ' 00 ' + ParseName ( @IP , 4 ), 3 ) + ' . ' + right ( ' 00 ' + ParseName ( @IP , 3 ), 3 ) + ' . ' + right ( ' 00 ' + ParseName ( @IP , 2 ), 3 ) + ' . ' + right ( ' 00 ' + ParseName ( @IP , 1 ), 3 ) RETURN @IPre END
如果大家想快速查詢的話我建議大家先把自己數(shù)據(jù)的IP段執(zhí)行一下這個函數(shù),然后每次查詢的時候直接轉(zhuǎn)要查詢的IP就行了,這樣速度會很快的。
例子如下:
-- ============================================= -- Author: <Author,sufei> -- Create date: <Create Date,2011-12-03> -- Description: <Description,查詢IP地址> -- ============================================= ALTER PROCEDURE [ dbo ] . [ GetIPInfoByIP ] @ip varchar ( 200 ) output AS BEGIN SET @ip = dbo.GetIP( @ip ) SELECT iptitle FROM Qqwry WHERE GetIP( @ip ) BETWEEN ipst AND ipend END
大家一定不要傻的這樣寫語句
SELECT iptitle FROM Qqwry WHERE GetIP( @ip ) BETWEEN ipst AND ipend
因為這樣的速度是極慢的,那是因為每一次檢查都要轉(zhuǎn)化。
在這里也提示大家在寫Sql語句時不要把函數(shù)直接寫在查詢語句內(nèi),當(dāng)然 如果是必須的那就沒有辦法了只能那樣了。
13.解決數(shù)據(jù)庫正在使用無法分離的存儲過程


set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER proc [ dbo ] . [ p_killspid ] @dbname varchar ( 200 ) -- 要關(guān)閉進程的數(shù)據(jù)庫名 as declare @sql nvarchar ( 500 ) declare @spid nvarchar ( 20 ) declare #tb cursor for select spid = cast (spid as varchar ( 20 )) from master..sysprocesses where dbid = db_id ( @dbname ) open #tb fetch next from #tb into @spid while @@fetch_status = 0 begin exec ( ' kill ' + @spid ) fetch next from #tb into @spid end close #tb deallocate #tb
使用方法
exec
dbo.p_killspid ‘?dāng)?shù)據(jù)庫名稱’
就先到這里吧,雖然不多,但也是大家常 見的問題,希望各位網(wǎng)友也把自己的經(jīng)驗分享一下。
14.刪除表中重復(fù)數(shù)大于N的數(shù)據(jù)
delete from dbo.DomainInFo_FIp_domain_old where D_IP in ( select D_IP FROM ( select max(D_IP)AS D_IP ,count(D_IP) AS con FROM DomainInFo_FIp_domain_old group by D_IP) as t WHERE con> 500000 )
15.把表中重復(fù)數(shù)小于N的數(shù)據(jù)寫入到一個新表中去(比較刪除的速度快100倍以上)
insert dbo.DomainInFo_FIp_domain_new select D_Domain,D_IP from dbo.DomainInFo_FIp_domain_old where D_IP in ( select D_IP FROM ( select max(D_Domain) as D_Domain, max(D_IP)AS D_IP ,count(D_IP) AS con FROM dbo.DomainInFo_FIp_domain group by D_IP ) as t WHERE con< 5000 )
16.把一個表中某列轉(zhuǎn)成以豆號分隔的字符串
declare @column_name varchar ( 2000 ) set @column_name = '' select @column_name = @column_name + convert ( varchar ,column_name ) + ' , ' from table
17.怎么取時間中的小時,分鐘等值
返回表示指定日期的指定日期部分的整數(shù)。語法
DATEPART ( ‘下面?zhèn)渥⒗锩娴倪x項’, date )
參數(shù) datepart 指定要返回的日期部分的參數(shù)。有關(guān)詳細(xì)信息,
日期部分 縮寫 年份 yy、yyyy
季度 qq、q
月份 mm、m
每年的某一日 dy、y
日期 dd、d
星期 wk、ww
工作日 dw
小時 hh
分鐘 mi、n
秒 ss、s
毫秒 ms
date 返回 datetime 值(或可隱式轉(zhuǎn)換為 datetime 值的值)的表達式。date 參數(shù)也可以是日期格式的字符串。datetime 數(shù)據(jù)類型僅用于 1753 年 1 月 1 日之后的日期。 對于之前的日期,將存儲為字符數(shù)據(jù)。在輸入 datetime 值時,請始終使用單引號將它們括起來。
如果只指定年份的后兩位數(shù)字,小于或等于兩位截止年份配置選項值的后兩位數(shù)字的值將與截止年份處于同一世紀(jì)中。比此選項值的后兩位數(shù)字大的值先于截止年份的世紀(jì)。例如,如果兩位數(shù)字的截止年份是 2049(默認(rèn)值),則“49”將被解釋為 2049,而“50”將被解釋為 1950。為了避免產(chǎn)生歧義,請使用四位年份。
有關(guān)指定日期的詳細(xì)信息,請參閱數(shù)據(jù)類型中的 datetime。
返回值 int
歡迎大家轉(zhuǎn)載,如有轉(zhuǎn)載請注明文章來自: http://sufei.cnblogs.com/
簽名:做一番一生引以為豪的事業(yè);在有生之年報答幫過我的人;并有能力幫助需要幫助的人;
軟件開發(fā),功能定制,請聯(lián)系我
QQ:361983679 Email:
sufei.1013@163.com
MSN:
sufei.1013@163.com
-------------------------------------------------------------------推薦文章--------------------------------------------------------------
1. C#仿QQ皮膚 2. Sql2005學(xué)習(xí)筆記 3. httpHelper類
Sql常見問題總結(jié)二(Sql語句怎么樣查詢IP,游標(biāo)去重復(fù),各種函數(shù)使用,各種取時間格式,字符串精確排序,超時鎖問題)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
