閱讀全文:http://www.sufeinet.com/forum.php?mod=viewthread&tid=401
導讀部分
------------------------------------------------------------------------------------------------------------
SQL Server 2005 學習筆記系列文章
http://www.sufeinet.com/forum.php?mod=viewthread&tid=26
這篇文章是上篇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所在段的函數代碼如下
IP庫大家可以去網上下載:http://www.cz88.net/
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