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


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
這個時候如果再有這種情況 出現只要你執行一下存儲過程就行了如例子
2.如果修改數據的架構
--'guest.Table_1'架構名+(表名,視頻,存儲過程),新架構名,
EXEC
SP_ChangeObjectOwner
'guest.Table_1'
,
'dbo'
|
3.如果安裝時選擇的windows驗證方法,怎么修改為Windows驗證和登錄用戶驗證模式?


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


-- 日期轉換參數 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 其它我不常用的日期格式轉換方法: 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 ())
第一個參數可以是下列任意一個
年 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 ' )
結果是1
ELECT DATEDIFF ( day , ' 2008-12-30 ' , ' 2008-12-29 ' )
結果是-1
7.相同結構表去重復后進行復制
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.一個取一張表中域名第一個“.”之前部分,并寫入另外一張表的游標實現
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 -- 開始抓數據 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 -- 關閉游標 Deallocate Mycursor -- 刪除游標
9.計算一表中某個字段的重復次數,游標實現
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 -- 開始抓數據 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 -- 關閉游標 Deallocate Mycursor -- 刪除游標
10.Replace函數的使用方法
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函數與Len以及Left的配合使用(字段D_Domain值第一個字符是點的就清除這個點)
update dbo.DomainInFo_FIp set D_Domain = Substring (D_Domain, 2 , Len (D_Domain)) where Left (D_Domain, 1 ) = ' . '
12.一個實現怎么樣查詢IP所在段的函數代碼如下
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
如果大家想快速查詢的話我建議大家先把自己數據的IP段執行一下這個函數,然后每次查詢的時候直接轉要查詢的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
因為這樣的速度是極慢的,那是因為每一次檢查都要轉化。
在這里也提示大家在寫Sql語句時不要把函數直接寫在查詢語句內,當然 如果是必須的那就沒有辦法了只能那樣了。
13.解決數據庫正在使用無法分離的存儲過程


set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER proc [ dbo ] . [ p_killspid ] @dbname varchar ( 200 ) -- 要關閉進程的數據庫名 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 ‘數據庫名稱’
就先到這里吧,雖然不多,但也是大家常 見的問題,希望各位網友也把自己的經驗分享一下。
14.刪除表中重復數大于N的數據
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.把表中重復數小于N的數據寫入到一個新表中去(比較刪除的速度快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.把一個表中某列轉成以豆號分隔的字符串
declare @column_name varchar ( 2000 ) set @column_name = '' select @column_name = @column_name + convert ( varchar ,column_name ) + ' , ' from table
17.怎么取時間中的小時,分鐘等值
返回表示指定日期的指定日期部分的整數。語法
DATEPART ( ‘下面備注里面的選項’, date )
參數 datepart 指定要返回的日期部分的參數。有關詳細信息,
日期部分 縮寫 年份 yy、yyyy
季度 qq、q
月份 mm、m
每年的某一日 dy、y
日期 dd、d
星期 wk、ww
工作日 dw
小時 hh
分鐘 mi、n
秒 ss、s
毫秒 ms
date 返回 datetime 值(或可隱式轉換為 datetime 值的值)的表達式。date 參數也可以是日期格式的字符串。datetime 數據類型僅用于 1753 年 1 月 1 日之后的日期。 對于之前的日期,將存儲為字符數據。在輸入 datetime 值時,請始終使用單引號將它們括起來。
如果只指定年份的后兩位數字,小于或等于兩位截止年份配置選項值的后兩位數字的值將與截止年份處于同一世紀中。比此選項值的后兩位數字大的值先于截止年份的世紀。例如,如果兩位數字的截止年份是 2049(默認值),則“49”將被解釋為 2049,而“50”將被解釋為 1950。為了避免產生歧義,請使用四位年份。
有關指定日期的詳細信息,請參閱數據類型中的 datetime。
返回值 int
歡迎大家轉載,如有轉載請注明文章來自: http://sufei.cnblogs.com/
簽名:做一番一生引以為豪的事業;在有生之年報答幫過我的人;并有能力幫助需要幫助的人;
軟件開發,功能定制,請聯系我
QQ:361983679 Email:
sufei.1013@163.com
MSN:
sufei.1013@163.com
-------------------------------------------------------------------推薦文章--------------------------------------------------------------
1. C#仿QQ皮膚 2. Sql2005學習筆記 3. httpHelper類
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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