校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > SQL2005CLR函數擴展-深入環比計算的詳解

SQL2005CLR函數擴展-深入環比計算的詳解

熱門標簽:沈陽智能外呼系統代理 浙江地圖標注 九鹿林外呼系統怎么收費 海南自動外呼系統價格 創業電銷機器人 舞鋼市地圖標注app 松原導航地圖標注 滄州營銷外呼系統軟件 電銷機器人虛擬號碼

此類問題還可以延伸到類似進銷存的批次計算中,這也要關注其他歷史記錄來決定當前某條記錄的狀態。

sql語句無法簡單實現mdx語句的類似功能,必須得用交叉表關聯來對比。這里我們用CLR函數來實現mdx語句的類似語法。在select的時候把得到過的做個緩存就可以了。效率應該可以提高不少。

clr的代碼如下,編譯為TestFun.dll,復制到sql服務器的文件目錄下。
--------------------------------------------------------------------------------

復制代碼 代碼如下:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{

    // 保存當前組當前值
    private static System.Collections.Generic.Dictionary string , SqlString > _listValue = new System.Collections.Generic.Dictionary string , SqlString >();
    // 保存當前組
    private static System.Collections.Generic.Dictionary string , string > _listGroup  = new System.Collections.Generic.Dictionary string , string >();

    /// summary>
    /// 獲取當前組上條記錄數值
    /// /summary>
    /// param name="key"> 并發鍵 /param>
    /// param name="currentGroup"> 當前組 /param>
    /// param name="currentValue"> 當前組當前值 /param>
    /// returns>/returns>
    [Microsoft.SqlServer.Server.SqlFunction ]
    public static SqlString GetPrevMemberValue(SqlString key,SqlString currentGroup,SqlString currentValue)
    {
        if (key.IsNull || currentGroup.IsNull) return SqlString .Null;

      
        try
        {
            SqlString prevMemberValue = _listValue[key.Value];

            // 組變更
            if (_listGroup[key.Value] != currentGroup.Value)
            {
                prevMemberValue = SqlString .Null;
                _listGroup[key.Value] = currentGroup.Value;
             }
            // 值變更
            _listValue[key.Value] = currentValue;

            return prevMemberValue;
        }
        catch
        {
            return SqlString .Null;
        }
    }
    /// summary>
    /// 初始化并發鍵
    /// /summary>
    /// param name="key">/param>
    /// returns>/returns>
    [Microsoft.SqlServer.Server.SqlFunction ]
    public static SqlBoolean InitKey(SqlString key)
    {
        try
        {
            _listValue.Add(key.Value, SqlString .Null);
            _listGroup.Add(key.Value, string .Empty);
            return true ;
        }
        catch
        {
            return false ;
        }
    }
    /// summary>
    /// 釋放并發鍵
    /// /summary>
    /// param name="key">/param>
    /// returns>/returns>
    [Microsoft.SqlServer.Server.SqlFunction ]
    public static SqlBoolean DisposeKey(SqlString key)
    {
        try
        {
            _listValue.Remove(key.Value);
            _listGroup.Remove(key.Value);
            return true ;
        }
        catch
        {
            return false ;
        }
    }
};

--------------------------------------------------------------------------------
部署和生成自定義函數,其中考慮到并發,我們還是需要一個并發鍵來表達當前查詢
--------------------------------------------------------------------------------
復制代碼 代碼如下:

CREATE ASSEMBLY TestForSQLCLR FROM 'E:/sqlclrdata/TestFun.dll' WITH PERMISSION_SET = UnSAFE;
--
go
CREATE FUNCTION dbo. xfn_GetPrevMemberValue 
(  
    @key nvarchar ( 255),
    @initByDim nvarchar ( 255),
    @currentValue nvarchar ( 255)
)    
RETURNS nvarchar ( 255)
AS EXTERNAL NAME TestForSQLCLR. [UserDefinedFunctions]. GetPrevMemberValue
go
CREATE FUNCTION dbo. xfn_initKey
(  
    @key nvarchar ( 255)
)    
RETURNS bit
AS EXTERNAL NAME TestForSQLCLR. [UserDefinedFunctions]. InitKey
go
CREATE FUNCTION dbo. xfn_disposeKey 
(  
    @key nvarchar ( 255)
)    
RETURNS bit
AS EXTERNAL NAME TestForSQLCLR. [UserDefinedFunctions]. DisposeKey

--------------------------------------------------------------------------------
這樣我們就可以使用了,測試腳本如下, xfn_GetPrevMemberValue就是獲取上月價格的函數。
--------------------------------------------------------------------------------
-- 建立測試環境
復制代碼 代碼如下:

declare @t table (
    [ 區域 ] [varchar]( 4) COLLATE Chinese_PRC_CI_AS NULL,
    [TradeMonth] [varchar]( 7) COLLATE Chinese_PRC_CI_AS NULL,
    [TradeMoney] [float] NULL,
    [TradeArea] [float] NULL,
    [TradePrice] [float] NULL
)
insert into @t
select ' 閔行 ' , '2007-03' , '2125714.91' , '241.65' , '8796.67' union
select ' 閔行 ' , '2007-04' , '8408307.64' , '907.32' , '9267.19' union
select ' 閔行 ' , '2007-05' , '10230321.95' , '1095.88' , '9335.26' union
select ' 浦東 ' , '2007-01' , '12738432.25' , '1419.05' , '8976.73' union
select ' 浦東 ' , '2007-02' , '4970536.74' , '395.49' , '12568.05' union
select ' 浦東 ' , '2007-03' , '5985405.76' , '745.94' , '8023.98' union
select ' 浦東 ' , '2007-04' , '21030788.61' , '1146.89' , '18337.23' union
select ' 普陀 ' , '2007-01' , '1863896' , '161.39' , '11549.02' union
select ' 普陀 ' , '2007-02' , '1614015' , '119.59' , '13496.24' union
select ' 普陀 ' , '2007-03' , '1059235.19' , '135.21' , '7834'
 
-- 測試語句
復制代碼 代碼如下:

declare @key varchar ( 40)
declare @b bit

set @key= newid ()
select @b= dbo. xfn_initKey( @key)

select 區域 , TradeMonth, TradePrice, LastMonthPrice,
cast ( round (( Tradeprice- LastMonthPrice)* 100/ LastMonthPrice, 2) as varchar ( 10))+ '%' as 環比 from (
select *, cast ( dbo. xfn_GetPrevMemberValue( @key, 區域 , Tradeprice) as float ) as LastMonthPrice from @t
) t
select @b= dbo. xfn_disposeKey( @key)
 
-- 結果
/*
區域   TradeMonth TradePrice             LastMonthPrice         環比
---- ---------- ---------------------- ---------------------- -----------
閔行   2007-03    8796.67                NULL                   NULL
閔行   2007-04    9267.19                8796.67                5.35%
閔行   2007-05    9335.26                9267.19                 0.73%
浦東   2007-01    8976.73                NULL                   NULL
浦東   2007-02    12568.05               8976.73                40.01%
浦東   2007-03    8023.98                12568                  -36.16%
浦東   2007-04    18337.23                8023.98                128.53%
普陀   2007-01    11549.02               NULL                   NULL
普陀   2007-02    13496.24               11549                  16.86%
普陀   2007-03    7834                   13496.2                -41.95%
*/
--------------------------------------------------------------------------------
這個函數寫的還是比較粗糙,如果進一步改進還可以詳細定義如何獲取上一個維度的方法。這里只是根據查詢順序來做緩存。感興趣的朋友可以完善一下。

您可能感興趣的文章:
  • 通過SQLSERVER重啟SQLSERVER服務和計算機的方法
  • 利用php+mysql來做一個功能強大的在線計算器
  • 在php和MySql中計算時間差的方法
  • mysql 字符串長度計算實現代碼(gb2312+utf8)
  • SQLSERVER 根據地圖經緯度計算距離差示例
  • 用sql實現18位身份證校驗代碼分享 身份證校驗位計算
  • SQL計算字符串中最大的遞增子序列的方法
  • SQL語句計算兩個日期之間有多少個工作日的方法
  • 如何計算多個訂單的核銷金額

標簽:日喀則 西藏 咸寧 海口 公主嶺 商洛 臺灣 寶雞

巨人網絡通訊聲明:本文標題《SQL2005CLR函數擴展-深入環比計算的詳解》,本文關鍵詞  SQL2005CLR,函數,擴展,深入,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL2005CLR函數擴展-深入環比計算的詳解》相關的同類信息!
  • 本頁收集關于SQL2005CLR函數擴展-深入環比計算的詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩精品亚洲专区| 亚洲伦理在线免费看| 91一区二区在线观看| 亚洲国产cao| 国产日韩一级二级三级| 色8久久精品久久久久久蜜| 日韩精品欧美精品| 国产精品视频在线看| 91精品国产免费| 91一区二区三区在线观看| 国产伦精品一区二区三区视频青涩| 亚洲欧美一区二区三区国产精品| 日韩欧美一区二区在线视频| 99国产精品国产精品毛片| 国产曰批免费观看久久久| 亚洲一区二区三区美女| 国产日韩成人精品| 日韩久久免费av| 欧美中文字幕一区二区三区| 国产成人精品免费看| 蜜乳av一区二区三区| 亚洲午夜精品17c| 日韩毛片视频在线看| 国产性色一区二区| 精品国产123| 日韩一区二区三区视频在线| 一本到高清视频免费精品| 国产91精品精华液一区二区三区| 免费黄网站欧美| 欧美成人综合网站| 狠狠色狠狠色综合系列| 日韩av一区二区在线影视| 欧美日韩日日骚| 欧美韩国日本综合| 亚洲午夜激情网页| 99久久精品国产精品久久| 欧美国产视频在线| 欧美日韩高清一区| 精品一区二区三区视频在线观看| 国产精品久久久久四虎| 色成年激情久久综合| 精品毛片乱码1区2区3区| 亚洲国产精品人人做人人爽| 6080午夜不卡| 色综合久久综合中文综合网| 国产一区二区精品久久99 | 青青草成人在线观看| 偷拍一区二区三区四区| 国产91对白在线观看九色| 欧美性猛交一区二区三区精品| 亚洲一区视频在线| 久久色在线视频| 欧美一区二区三区在线观看| 国产成人精品三级| 久久精品噜噜噜成人88aⅴ| 亚洲综合在线电影| 国产精品国产三级国产aⅴ无密码| 91.com视频| 日韩欧美国产精品一区| 国产精品久久午夜夜伦鲁鲁| 色久优优欧美色久优优| 欧洲精品中文字幕| 欧美老年两性高潮| 欧美一区二区在线播放| 国产视频一区二区在线观看| 久久日一线二线三线suv| 久久久久久黄色| 中文字幕在线播放不卡一区| 亚洲欧洲精品一区二区三区| 亚洲人成网站在线| 天天操天天色综合| 精品一区二区三区的国产在线播放| 国产一区欧美一区| 成人黄色一级视频| 欧美色成人综合| 欧美videos大乳护士334| 欧美国产国产综合| 亚洲一区二区精品久久av| 麻豆精品在线看| 成人一区在线观看| 在线亚洲高清视频| www国产成人| 亚洲国产精品久久久久秋霞影院| 日韩成人午夜精品| 国产精品系列在线播放| 色婷婷香蕉在线一区二区| 欧美一卡在线观看| 国产精品短视频| 日韩av电影免费观看高清完整版在线观看 | 中文字幕一区二区在线播放 | 国产乱子伦一区二区三区国色天香| 成人午夜免费av| 欧美群妇大交群的观看方式| 国产日韩欧美精品电影三级在线 | 中文字幕不卡在线| 三级一区在线视频先锋| 国产69精品久久久久毛片| 欧美精品色综合| 国产精品久久久久久久久快鸭| 婷婷国产在线综合| 99久久伊人网影院| 精品久久久影院| 国产三级精品三级在线专区| 国产午夜精品一区二区三区嫩草| 亚洲精品免费电影| 国产乱码精品一区二区三区五月婷| 日本韩国一区二区三区视频| 久久综合久久综合九色| 亚洲综合丝袜美腿| 岛国av在线一区| 精品国产a毛片| 视频一区在线播放| 91久久国产最好的精华液| 久久九九影视网| 免费精品视频在线| 欧美区一区二区三区| 亚洲欧美日韩一区| 成人看片黄a免费看在线| 欧美成人一区二区三区| 亚洲成av人片在www色猫咪| 99久久精品一区| 国产午夜精品一区二区| 精品中文av资源站在线观看| 欧美精品欧美精品系列| 亚洲精品日产精品乱码不卡| 岛国av在线一区| 国产精品天干天干在线综合| 国产成人在线免费| 久久久影视传媒| 韩国视频一区二区| 日韩欧美123| 久久精品国产亚洲高清剧情介绍| 欧美性一级生活| 亚洲国产人成综合网站| 在线观看一区日韩| 一区二区不卡在线播放| 91国内精品野花午夜精品| 亚洲免费成人av| 91啦中文在线观看| 亚洲欧美另类久久久精品2019 | 欧美系列亚洲系列| 亚洲欧美激情插| 色94色欧美sute亚洲线路二 | 7799精品视频| 男男成人高潮片免费网站| 欧美一区二区啪啪| 青青草成人在线观看| 欧美精品一区二区不卡| 国产综合色产在线精品| 国产日韩欧美制服另类| 成人99免费视频| 亚洲日穴在线视频| 欧美日韩一区高清| 久久精品国产亚洲a| 久久精品一区二区| 91丨九色丨国产丨porny| 一区二区三区在线观看欧美 | 国产精品久久久久久久久图文区 | 欧美性大战久久久久久久| 亚欧色一区w666天堂| 日韩欧美一级精品久久| 国产剧情一区在线| 亚洲天堂a在线| 欧美日韩欧美一区二区| 久久精品国产色蜜蜜麻豆| 欧美精品一区二区三区蜜桃| 波多野结衣欧美| 亚洲国产精品人人做人人爽| 欧美成人精品1314www| 成人看片黄a免费看在线| 亚洲在线观看免费视频| 日韩欧美色综合网站| av成人免费在线| 天天色天天操综合| 欧美经典三级视频一区二区三区| 色综合咪咪久久| 久久99在线观看| 亚洲日本乱码在线观看| 日韩一级在线观看| 99久久er热在这里只有精品66| 丝袜美腿亚洲综合| 国产精品情趣视频| 欧美精品日日鲁夜夜添| 国产.欧美.日韩| 午夜天堂影视香蕉久久| 久久精品亚洲一区二区三区浴池| 色综合久久久久久久久| 精一区二区三区| 亚洲综合色网站| 国产偷国产偷亚洲高清人白洁| 欧美午夜免费电影| 成人在线视频首页| 美国三级日本三级久久99| 亚洲人妖av一区二区| 26uuu亚洲综合色| 777亚洲妇女| 欧美性videosxxxxx| 99精品久久久久久| 国产剧情在线观看一区二区| 天天影视网天天综合色在线播放|