牛牛影视精品影视,日本一区二区精品,av在线电影免费观看http://www.aygfsteel.com/midstr/category/30639.html人生非夢zh-cnFri, 06 Nov 2009 16:31:24 GMTFri, 06 Nov 2009 16:31:24 GMT60sybase數據庫端分頁http://www.aygfsteel.com/midstr/archive/2008/10/14/234258.html歲月如歌歲月如歌Tue, 14 Oct 2008 08:36:00 GMThttp://www.aygfsteel.com/midstr/archive/2008/10/14/234258.htmlhttp://www.aygfsteel.com/midstr/comments/234258.htmlhttp://www.aygfsteel.com/midstr/archive/2008/10/14/234258.html#Feedback0http://www.aygfsteel.com/midstr/comments/commentRss/234258.htmlhttp://www.aygfsteel.com/midstr/services/trackbacks/234258.html      基本的思路有如下幾種:

  1. 從12.5.3版本開始sybase支持top關鍵字,試著使用,但是未果(同事說sybase對top支持不好),因為不支持嵌套。使用的是如下的sql:  
    select top 10 t1.AH, t1.BH from K_ZS..B_MS t1 where t1.BH not in (select top 20 t2.BH from K_ZS..B_MS t2) 
    這里的是不帶order by的,另外一種是帶order by的,效率會比較高。
  2. 在存儲過程端使用set rowcount 來實現分頁,沒有試驗。
  3. 用存儲過程,建立臨時表,獲取數據,然后動態sql獲得臨時表數據。最后從網上找到的如下的兩個分頁存儲過程:
    -- 按行讀取

    CREATE PROCEDURE GetDataByLine
    (
            
    --創建一個分頁讀取過程
        @SqlStr         varchar(8000),    --SQL語句
        @FirstRec       int,        --頁起始行
        @LastRec        int        --頁結束行
    )
    AS
    DECLARE @dt varchar(10)    --生成臨時表的隨機數
    BEGIN

        
    SELECT @dt= substring(convert(varcharrand()), 310)    --一個字符型的隨機數
        
        
    --將搜索結果放入臨時表中,表名隨機生成,在' FROM '前插入'INTO '+隨機臨時表名
        SELECT @SqlStr = stuff(@SqlStrcharindex(' FROM 'upper(@SqlStr)), 6 ,' INTO tempdb..Lining' + @dt + ' FROM ')
        
    EXECUTE (@SqlStr)
        
        
    --為臨時表增加id號
        SELECT @SqlStr = 'ALTER TABLE tempdb..Lining' + @dt + ' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
        
    EXECUTE (@SqlStr)
        
        
    --計算臨時表中的記錄數
        --SELECT @SqlStr = 'SELECT Count(*) From tempdb..Lining' + @dt
        --EXECUTE (@SqlStr)
        
        
    --選取記錄號在起始行和結束行中間的記錄
        SELECT @SqlStr = 'SELECT * FROM tempdb..Lining'+@dt+' WHERE TEMPDB_ID > ' + convert(varchar@FirstRec+ ' and TEMPDB_ID <= ' + convert(varchar@LastRec)
        
    EXECUTE (@SqlStr)
        
        
    --刪除臨時表
        SELECT @SqlStr = 'DROP TABLE tempdb..Lining'+@dt
        
    EXECUTE (@SqlStr
      
    END

    /*
    some comments:
    1.@SqlStr     varchar(8000), depends on your page size
    2. this is a generic paging sp, if you just want to use it for specific table, 
       you'd better change the 'tempdb..Lining' to #Paging, the performance will be better
    */

    -- 按頁讀取

    CREATE PROCEDURE GetDataByPage
    (
        
    --創建一個分頁讀取過程
        @SqlStr         varchar(8000),    --SQL語句
        @PageSize       int,            --每頁記錄數
        @CurrentPage    int                --當前頁數
    )
    AS
    DECLARE @FirstRec int@LastRec int@dt varchar(10)    --頁起始行,頁結束行,生成臨時表的隨機數
    BEGIN

        
    SELECT @FirstRec = (@CurrentPage - 1* @PageSize    --計算頁起始行
        SELECT @LastRec = (@CurrentPage * @PageSize + 1)    --計算頁結束行
        
        
    SELECT @dt= substring(convert(varchar,rand()),3,10)    --一個字符型的隨機數
        
        
    --將搜索結果放入臨時表中,表名隨機生成,在' FROM '前插入'INTO '+隨機臨時表名
        SELECT @SqlStr = stuff(@SqlStrcharindex(' FROM ',upper(@SqlStr)), 6 ,' INTO tempdb..Paging'+@dt+' FROM ')
        
    EXECUTE (@SqlStr)
        
        
    --為臨時表增加id號
        SELECT @SqlStr = 'ALTER TABLE tempdb..Paging'+@dt+' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
        
    EXECUTE (@SqlStr)
        
        
    --計算臨時表中的記錄數
        --SELECT @SqlStr = 'SELECT Count(*) From tempdb..Paging'+@dt
        --EXECUTE (@SqlStr)
        
        
    --選取記錄號在起始行和結束行中間的記錄
        SELECT @SqlStr = 'SELECT * FROM tempdb..Paging'+@dt+' WHERE TEMPDB_ID > '+convert(varchar,@FirstRec)+' and TEMPDB_ID < '+convert(varchar,@LastRec)
        
    EXECUTE (@SqlStr)
        
        
    --刪除臨時表
        SELECT @SqlStr = 'DROP TABLE tempdb..Paging'+@dt
        
    EXECUTE (@SqlStr
      
    END

    /*
    some comments:
    1. @SqlStr     varchar(8000), depends on your page size
    2. this is a generic paging sp, if you just want to use it for specific table, 
       you'd better change the 'tempdb..Paging' to #Paging, the performance will be better
    */


-- 清空日志
Dump Transaction DB_BD With truncate_only
go

use DB_BD
go

if existsselect 1 from sysobjects
             
where id = object_id'PR_GET_PAGESIZE' )
               
and sysstat & 15 = 4 )
  
drop procedure PR_GET_PAGESIZE
go

create procedure PR_GET_PAGESIZE (
    
@SqlStr         varchar(8000),    -- SQL語句
    @PageSize       int,                  -- 每頁記錄數
    @CurrentPage    int                      -- 當前頁數
)
as
begin
    
declare @FirstRec int,     -- 頁起始行  
          @maxCount int,     -- 頁結束行
          @dt varchar(10)       -- 生成臨時表的隨機數
    select @FirstRec = (@CurrentPage - 1* @PageSize    -- 計算頁起始行
    
    
    
-- 將搜索結果放入臨時表中,表名隨機生成,在' from '前插入'into '+隨機臨時表名
    select @SqlStr = stuff(@SqlStrcharindex(' from ',lower(@SqlStr)), 6,
      
', TEMPDB_ID = identity(11) into #temp_page from ')
    
    
-- 設置結束行
    select @maxCount = @PageSize*@CurrentPage
    
select @SqlStr = 'set rowcount ' + convert(varchar@maxCount
                    
+  ' ' + @SqlStr 
                    
+ '  set rowcount 0 '
    
    
-- 選取記錄號在起始行和結束行中間的記錄  
    select @SqlStr = @SqlStr + ' select * from #temp_page where TEMPDB_ID > ' + convert(varchar@FirstRec
    
print '%1!'@SqlStr  
    
execute (@SqlStr)
  
end
go

sp_procxmode PR_GET_PAGESIZE, anymode
go


歲月如歌 2008-10-14 16:36 發表評論
]]>
soloaris發布項目中文漢字“〇”亂碼問題http://www.aygfsteel.com/midstr/archive/2008/09/30/231896.html歲月如歌歲月如歌Tue, 30 Sep 2008 08:47:00 GMThttp://www.aygfsteel.com/midstr/archive/2008/09/30/231896.htmlhttp://www.aygfsteel.com/midstr/comments/231896.htmlhttp://www.aygfsteel.com/midstr/archive/2008/09/30/231896.html#Feedback0http://www.aygfsteel.com/midstr/comments/commentRss/231896.htmlhttp://www.aygfsteel.com/midstr/services/trackbacks/231896.htmljdbc:sybase:Tds:172.16.6.114:6000/DB_LC?charset=utf8)。
       程序發布到soloaris環境之后,在html頁面中文漢字“〇”顯示為亂碼“??”,咨詢一位高手得到如下解答:
      “〇”的GB系列編碼是A996,非GB-2312集合所包含,GBK集合才引入;〇的unicode編碼是U+3007,大約被認為是個符號,而不是漢字,U+3000附近的是全角的逗號、頓號、句號之流,而漢字(CJK基本集)是U+4E00~U+9FA5。
       另外一位同事給出解決方案:
       solaris下啟動TOMCAT之前,先執行一下如下操作:
             LANG=zh_CN.GB18030
             export LANG
       然后再啟動。

      問題解決,最后把這兩句加在了catalina.sh文件的最前面,以免每次啟動都得單獨執行。



歲月如歌 2008-09-30 16:47 發表評論
]]>
關于varchar的長度和數據庫字符集遷移的問題http://www.aygfsteel.com/midstr/archive/2008/09/19/229976.html歲月如歌歲月如歌Fri, 19 Sep 2008 09:05:00 GMThttp://www.aygfsteel.com/midstr/archive/2008/09/19/229976.htmlhttp://www.aygfsteel.com/midstr/comments/229976.htmlhttp://www.aygfsteel.com/midstr/archive/2008/09/19/229976.html#Feedback0http://www.aygfsteel.com/midstr/comments/commentRss/229976.htmlhttp://www.aygfsteel.com/midstr/services/trackbacks/229976.htmlsybase的用戶手冊,n的范圍為數據的頁大小,
   即使用select @@maxpagesize查到的數字。
 
除非設定string_rtruncation on,Adaptive Server將條目截斷到指定列的長度而不加警告或出現錯誤信息。
2、數據庫從cp850遷移到utf-8環境之后,原來的獲取當事人名稱的存儲過程返回的結果有誤,即有名稱被截取的問題,如下代碼: 
 
-- 去掉末尾的頓號
    set @MC = substring(@MC1len(@MC- 2)


比如說當事人名稱為“張三、李四、”,在原來的cp850庫返回的結果是“張三、李四。但是升級到utf-8之后,返回的就是“張三、李”。
  主要是cp850字符集,一個漢字占兩個字節,而升級到utf-8之后就占三個字節了,所以這里的減2就不正確了。
  執行如下的腳本
declare @MC varchar(100
declare @length int
set @MC = '張三、李四、'
set @length = len(@MC)
print '%1!'@length
set @MC = substring(@MC1len(@MC- len(''))
print '%1!'@MC
在cp850下,print '%1!', @length打印的長度為12,而在utf-8下則返回的是6。當然print '%1!', @MC打印的結果都是"張三、李四"
  所以最終把代碼改為如下就正確了,字符集就不會影響結果。
-- 去掉末尾的頓號
    set @MC = substring(@MC1len(@MC- len(''))
經常看到數據庫版本限制引起的各種問題,看來有些知識需要普及一下。
除了查手冊外,再提供一種比較方便的方法,可以得到當前ASE服務器上各項限制值。
執行如下命令即可:
dbcc traceon(3604)
go
dbcc serverlimits
go


歲月如歌 2008-09-19 17:05 發表評論
]]>
關于count函數http://www.aygfsteel.com/midstr/archive/2008/08/30/225739.html歲月如歌歲月如歌Sat, 30 Aug 2008 06:51:00 GMThttp://www.aygfsteel.com/midstr/archive/2008/08/30/225739.htmlhttp://www.aygfsteel.com/midstr/comments/225739.htmlhttp://www.aygfsteel.com/midstr/archive/2008/08/30/225739.html#Feedback1http://www.aygfsteel.com/midstr/comments/commentRss/225739.htmlhttp://www.aygfsteel.com/midstr/services/trackbacks/225739.htmlsybase的Transact-SQL用戶指南是這樣說的: count 得出表達式中非空值的數量,而 count(*) 得出表中的總行數。

select count(LAAY) from K_ZS.. B_MS
select count(distinct LAAY) from K_ZS.. B_MS
select count(*) from K_ZS..B_MS

上面的三條sql在2.106開發庫上執行結果如下:
-----------
      61940
-----------
        353           
-----------
      72127

    以前老以為對同一個查詢條件,count(fieldname)和count(*)的結果是一樣的……所以首先要對count函數的定義清楚,
從我們一般使用count函數的角度,這里最好就是用count(*) 或者count(主鍵),或者是一個肯定不為null的列,不然結果就可能少了。

另外從性能上,在K_MS.. B_MS上做實驗,數據為1472435條(其中BH為主鍵):
引用:
select count(*) from K_MS.. B_MS
  Execution Time 2.
  SQL Server cpu time: 200 ms.  SQL Server elapsed time: 283 ms.

  select count(BH) from K_MS.. B_MS  
  Execution Time 2.
  SQL Server cpu time: 200 ms.  SQL Server elapsed time: 233 ms.
如果用表中的其他非主鍵字段(其中LAAY、JBFY為索引字段,SPCX普通字段),比如
引用:
select count(LAAY) from K_MS.. B_MS
  Execution Time 4.
  SQL Server cpu time: 400 ms.  SQL Server elapsed time: 326 ms.

  select count(SPCX) from K_MS.. B_MS
  Execution Time 194.
  SQL Server cpu time: 19400 ms.  SQL Server elapsed time: 28373 ms.

  select count(JBFY) from K_MS.. B_MS
  Execution Time 16.
  SQL Server cpu time: 1600 ms.  SQL Server elapsed time: 2436 ms.
多次執行以上sql可以得出初步結論:count(主鍵)最快,count(*)次之,并且兩者性能差異不大;但是如果count其他
任何非主鍵字段,則速度一般會比較慢,尤其是哪些非索引字段。

歲月如歌 2008-08-30 14:51 發表評論
]]>
主站蜘蛛池模板: 陇川县| 读书| 杭州市| 上栗县| 沁水县| 兖州市| 通道| 永寿县| 平谷区| 广西| 宜宾市| 广昌县| 阿鲁科尔沁旗| 新化县| 建阳市| 北京市| 陆川县| 偏关县| 湘乡市| 四子王旗| 湟源县| 抚州市| 大同县| 滕州市| 资阳市| 隆尧县| 清流县| 武汉市| 沙坪坝区| 元氏县| 元江| 武乡县| 南涧| 宜兰市| 玛多县| 晋宁县| 郓城县| 瑞昌市| 成安县| 贡嘎县| 崇仁县|