Sql常見問題總結二(Sql語句怎麼樣查詢IP,遊標去重複,各種函數使用,各種取時間格式,字符串精確排序,超時鎖問題)

請穩步我的博客查閱並下載所有資源以及源代碼 http://www.cckan.net

章導航  SQL Server 2005  學習筆記系列文章導航(存儲過程,視頻,索引,Clr,各種工具使用)

這篇文章是上篇SQl使用方法總結 的延續篇

1.當很多在共用你自己的數據時,時不時的會報這種錯誤“已超過了鎖請求超時時段”

直接把下在面的存儲過程 放到你的Master數據庫執行一下就可以了

View Code
複製代碼
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 
複製代碼


這個時候如果再有這種情況 出現只要你執行一下存儲過程就行了如例子

exec Sp_KillAllProcessInDB'要訪問的數據庫'

2.如果修改數據的架構

--'guest.Table_1'架構名+(表名,視頻,存儲過程),新架構名, 
EXEC SP_ChangeObjectOwner 'guest.Table_1','dbo'

3.如果安裝時選擇的windows驗證方法,怎麼修改爲Windows驗證和登錄用戶驗證模式?

View Code
複製代碼
/* 標題:更改登錄用戶驗證方式 作者:蘇飛  時間: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.時間格式轉化

View Code
複製代碼
--日期轉換參數
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.解決數據庫正在使用無法分離的存儲過程

View Code
複製代碼
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/  

簽名:做一番一生引以爲豪的事業;在有生之年報答幫過我的人;並有能力幫助需要幫助的人;    


-------------------------------------------------------------------推薦文章--------------------------------------------------------------
1.C#仿QQ皮膚 2.Sql2005學習筆記 3.httpHelper類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章