梦想空间's profile梦想空间PhotosBlogListsMore Tools Help

Blog


    June 22

    SQL与ACCESS、EXCEL的数据转换(收藏)

      熟悉SQL SERVER 2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact-SQL语句进行导入导出操作。在Transact-SQL语句中,我们主要使用OpenDataSource函数、OPENROWSET 函数,关于函数的详细说明,请参考SQL联机帮助。利用下述方法,可以十分容易地实现SQL SERVER、ACCESS、EXCEL数据转换,详细说明如下:

    一、 SQL SERVER 和ACCESS的数据导入导出

    常规的数据导入导出:

    使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:

      1在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Transformation

      2Services(数据转换服务),然后选择 czdImport Data(导入数据)。

      3在Choose a Data Source(选择数据源)对话框中选择Microsoft Access as the Source,然后键入你的.mdb数据库(.mdb文件扩展名)的文件名或通过浏览寻找该文件。

      4在Choose a Destination(选择目标)对话框中,选择Microsoft OLE DB Prov ider for SQL Server,选择数据库服务器,然后单击必要的验证方式。

      5在Specify Table Copy(指定表格复制)或Query(查询)对话框中,单击Copy tables(复制表格)。

    6在Select Source Tables(选择源表格)对话框中,单击Select All(全部选定)。下一步,完成。

    Transact-SQL语句进行导入导出:

    1. 在SQL SERVER里查询access数据:

    -- ======================================================

    SELECT *

    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

    'Data Source="c:DB.mdb";User ID=Admin;Password=')...表名

    -------------------------------------------------------------------------------------------------

    2. 将access导入SQL server

    -- ======================================================

    在SQL SERVER 里运行:

    SELECT *

    INTO newtable

    FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0',

    'Data Source="c:DB.mdb";User ID=Admin;Password=' )...表名

    -------------------------------------------------------------------------------------------------

    3. 将SQL SERVER表里的数据插入到Access表中

    -- ======================================================

    在SQL SERVER 里运行:

    insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

    'Data Source=" c:DB.mdb";User ID=Admin;Password=')...表名

    (列名1,列名2)

    select 列名1,列名2 from sql表

    实例:

    insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0',

    'C:db.mdb';'admin';', Test)

    select id,name from Test

    INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'c: rade.mdb'; 'admin'; ', 表名)

    SELECT *

    FROM sqltablename

    -------------------------------------------------------------------------------------------------

    二、 SQL SERVER 和EXCEL的数据导入导出

    1、在SQL SERVER里查询Excel数据:

    -- ======================================================

    SELECT *

    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

    'Data Source="c:book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

    下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。

    SELECT * 
    FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:Financeaccount.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

    -------------------------------------------------------------------------------------------------

    2、将Excel的数据导入SQL server :

    -- ======================================================

    SELECT * into newtable

    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

    'Data Source="c:book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

    实例:

    SELECT * into newtable

    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

    'Data Source="c:Financeaccount.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

    -------------------------------------------------------------------------------------------------

    3、将SQL SERVER中查询到的数据导成一个Excel文件

    -- ======================================================

    T-SQL代码:

    EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:Temp.xls -c -q -S"servername" -U"sa" -P""'

    参数:S 是SQL服务器名;U是用户;P是密码

    说明:还可以导出文本文件等多种格式

    实例:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c: emp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'

    EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C: authors.xls -c -Sservername -Usa -Ppassword'

    在VB6中应用ADO导出EXCEL文件代码:

    Dim cn As New ADODB.Connection

    cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"

    cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:DT.xls -c -Sservername -Usa -Ppassword'"

    -------------------------------------------------------------------------------------------------

    4、在SQL SERVER里往Excel插入数据:

    -- ======================================================

    insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

    'Data Source="c:Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...table1 (A1,A2,A3) values (1,2,3)

    T-SQL代码:

    INSERT INTO

    OPENDATASOURCE('Microsoft.JET.OLEDB.4.0',

    'Extended Properties=Excel 8.0;Data source=C: raininginventur.xls')...[Filiale1$]

    (bestand, produkt) VALUES (20, 'Test')

    -------------------------------------------------------------------------------------------------

    总结:利用以上语句,我们可以方便地将SQL SERVER、ACCESS和EXCEL电子表格软件中的数据进行转换,为我们提供了极大方便! 

    MD5算法的T-SQL实现(续)

    /*****************************************************************************
    * Name: MD5
    * Description: MD5
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5(
       @sOrigMess  NVARCHAR(4000)
    )
    RETURNS CHAR(32)
    WITH ENCRYPTION
    AS
    BEGIN
      --====================================
      DECLARE @S11 TINYINT
      DECLARE @S12 TINYINT
      DECLARE @S13 TINYINT
      DECLARE @S14 TINYINT
      DECLARE @S21 TINYINT
      DECLARE @S22 TINYINT
      DECLARE @S23 TINYINT
      DECLARE @S24 TINYINT
      DECLARE @S31 TINYINT
      DECLARE @S32 TINYINT
      DECLARE @S33 TINYINT
      DECLARE @S34 TINYINT
      DECLARE @S41 TINYINT
      DECLARE @S42 TINYINT
      DECLARE @S43 TINYINT
      DECLARE @S44 TINYINT


      SELECT @S11 = 7, @S12 = 12, @S13 = 17, @S14 = 22
      SELECT @S21 = 5, @S22 = 9, @S23 = 14, @S24 = 20
      SELECT @S31 = 4, @S32 = 11, @S33 = 16, @S34 = 23
      SELECT @S41 = 6, @S42 = 10, @S43 = 15, @S44 = 21
      --====================================
      DECLARE @a INT
      DECLARE @b INT
      DECLARE @c INT
      DECLARE @d INT
      DECLARE @AA  INT
      DECLARE @BB  INT
      DECLARE @CC  INT
      DECLARE @DD  INT


      SELECT  @a = 0x67452301
          ,@b = 0xEFCDAB89
          ,@c = 0x98BADCFE
          ,@d = 0x10325476
      --====================================
      DECLARE @sRes  VARCHAR(32)
      SET @sRes = ''''''''
      DECLARE @iWordArrayLen    INT
      DECLARE @iWordArrayCount  INT


      DECLARE @tTmp TABLE([ID] INT, [Word] INT)
      INSERT INTO @tTmp SELECT * FROM dbo.MD5_ConvertToWordArray(@sOrigMess)
      SELECT @iWordArrayCount=0, @iWordArrayLen = COUNT(*) FROM @tTmp


      WHILE(@iWordArrayCount < @iWordArrayLen)
      BEGIN
        SELECT @AA = @a, @BB = @b, @CC = @c, @DD = @d


        SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S11, 0xD76AA478)
        SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S12, 0xE8C7B756)
        SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S13, 0x242070DB)
        SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S14, 0xC1BDCEEE)
        SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S11, 0xF57C0FAF)
        SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S12, 0x4787C62A)
        SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S13, 0xA8304613)
        SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S14, 0xFD469501)
        SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S11, 0x698098D8)
        SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S12, 0x8B44F7AF)
        SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S13, 0xFFFF5BB1)
        SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S14, 0x895CD7BE)
        SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S11, 0x6B901122)
        SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S12, 0xFD987193)
        SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S13, 0xA679438E)
        SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S14, 0x49B40821)

        SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S21, 0xF61E2562)
        SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S22, 0xC040B340)
        SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S23, 0x265E5A51)
        SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S24, 0xE9B6C7AA)
        SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S21, 0xD62F105D)
        SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S22, 0x2441453)
        SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S23, 0xD8A1E681)
        SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S24, 0xE7D3FBC8)
        SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S21, 0x21E1CDE6)
        SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S22, 0xC33707D6)
        SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S23, 0xF4D50D87)
        SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S24, 0x455A14ED)
        SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S21, 0xA9E3E905)
        SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S22, 0xFCEFA3F8)
        SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S23, 0x676F02D9)
        SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S24, 0x8D2A4C8A)


        SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S31, 0xFFFA3942)
        SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S32, 0x8771F681)
        SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S33, 0x6D9D6122)
        SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S34, 0xFDE5380C)
        SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S31, 0xA4BEEA44)
        SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S32, 0x4BDECFA9)
        SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S33, 0xF6BB4B60)
        SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S34, 0xBEBFBC70)
        SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S31, 0x289B7EC6)
        SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S32, 0xEAA127FA)
        SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S33, 0xD4EF3085)
        SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S34, 0x4881D05)
        SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S31, 0xD9D4D039)
        SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S32, 0xE6DB99E5)
        SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S33, 0x1FA27CF8)
        SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S34, 0xC4AC5665)


        SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S41, 0xF4292244)
        SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S42, 0x432AFF97)
        SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S43, 0xAB9423A7)
        SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S44, 0xFC93A039)
        SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S41, 0x655B59C3)
        SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S42, 0x8F0CCC92)
        SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S43, 0xFFEFF47D)
        SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S44, 0x85845DD1)
        SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S41, 0x6FA87E4F)
        SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S42, 0xFE2CE6E0)
        SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S43, 0xA3014314)
        SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S44, 0x4E0811A1)
        SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S41, 0xF7537E82)
        SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S42, 0xBD3AF235)
        SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S43, 0x2AD7D2BB)
        SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S44, 0xEB86D391)


        SET @a = dbo.MD5_AddUnsigned(@a, @AA)
        SET @b = dbo.MD5_AddUnsigned(@b, @BB)
        SET @c = dbo.MD5_AddUnsigned(@c, @CC)
        SET @d = dbo.MD5_AddUnsigned(@d, @DD)


        SET @iWordArrayCount = @iWordArrayCount + 16
      END


      SET @sRes = dbo.MD5_WordToHex(@a) + dbo.MD5_WordToHex(@b) + dbo.MD5_WordToHex(@c) + dbo.MD5_WordToHex(@d)
      SET @sRes = LOWER(@sRes)
      RETURN(@sRes)
    END
    GO


    --Test
    set nocount on
    select dbo.MD5('''''''') as ''''MD5('''''''''''''''')''''
    union
    select ''''d41d8cd98f00b204e9800998ecf8427e''''


    select dbo.MD5(''''a'''') as ''''MD5(''''''''a'''''''')''''
    union
    select ''''0cc175b9c0f1b6a831c399e269772661''''


    select dbo.MD5(''''abc'''') as ''''MD5(''''''''abc'''''''')''''
    union
    select ''''900150983cd24fb0d6963f7d28e17f72''''


    select dbo.MD5(''''message digest'''') as ''''MD5(''''''''message digest'''''''')''''
    union
    select ''''f96b697d7cb7938d525a2f31aaf161d0''''


    select dbo.MD5(''''abcdefghijklmnopqrstuvwxyz'''') as ''''MD5(''''''''abcdefghijklmnopqrstuvwxyz'''''''')''''
    union
    select ''''c3fcd3d76192e4007dfb496cca67e13b''''


    select dbo.MD5(''''ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'''') as ''''MD5(''''''''ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'''''''')''''
    union
    select ''''d174ab98d277d9f5a5611c2c9f419d9f''''


    select dbo.MD5(''''12345678901234567890123456789012345678901234567890123456789012345678901234567890'''') as ''''MD5(''''''''12345678901234567890123456789012345678901234567890123456789012345678901234567890'''''''')''''
    union
    select ''''57edf4a22be3c955ac49da2e2107b67a''''


    select dbo.MD5(''''我'''') as ''''MD5(''''''''我'''''''')''''
    union
    select ''''a31d0f25367ebe046897f8a939ca4a9f''''

    MD5算法的T-SQL实现

    MD5算法实现


    MD5算法实现
    1、MD5算法是对输入的数据进行补位,使得如果数据位长度LEN对512求余的结果是448。 即数据扩展至K*512+448位。即K*64+56个字节,K为整数。
    具体补位操作:补一个1,然后补0至满足上述要求
    2、补数据长度:
    用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。这时,数据
    就被填
    补成长度为512位的倍数。
    3. 初始化MD5参数
    四个32位整数 (A,B,C,D) 用来计算信息摘要,初始化使用的是十六进制表示
    的数字
    A=0X01234567
    B=0X89abcdef
    C=0Xfedcba98
    D=0X76543210
    4、处理位操作函数
    X,Y,Z为32位整数。
    F(X,Y,Z) = X&Y|NOT(X)&Z
    G(X,Y,Z) = X&Z|Y&not(Z)
    H(X,Y,Z) = X xor Y xor Z
    I(X,Y,Z) = Y xor (X|not(Z))
    5、主要变换过程:
    使用常数组T[1 ... 64], T[i]为32位整数用16进制表示,数据用16个32位的

    数数组M[]表示。
    具体过程如下:
    /* 处理数据原文 */
    For i = 0 to N/16-1 do
    /*每一次,把数据原文存放在16个元素的数组X中. */
    For j = 0 to 15 do
    Set X[j] to M[i*16+j].
    end /结束对J的循环
    /* Save A as AA, B as BB, C as CC, and D as DD. */
    AA = A
    BB = B
    CC = C
    DD = D
    /* 第1轮*/
    /* 以 [abcd k s i]表示如下操作
    a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
    /* Do the following 16 operations. */
    [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
    [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
    [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
    [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
    /* 第2轮* */
    /* 以 [abcd k s i]表示如下操作
    a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
    /* Do the following 16 operations. */
    [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
    [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
    [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
    [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
    /* 第3轮*/
    /* 以 [abcd k s i]表示如下操作
    a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
    /* Do the following 16 operations. */
    [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
    [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
    [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
    [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
    /* 第4轮*/
    /* 以 [abcd k s i]表示如下操作
    a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
    /* Do the following 16 operations. */
    [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
    [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
    [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
    [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
    /* 然后进行如下操作 */
    A = A + AA
    B = B + BB
    C = C + CC
    D = D + DD
    end /* 结束对I的循环*/
    6、输出结果。

    /*****************************************************************************
    * Name: T-SQL MD5算法实现
    * Author: Rambo Qian
    * Create Date: 2003-04-10
    * Last Modified by: Rambo Qian
    * Last Update Date: 2003-04-16

    * Version: V1.0.00
    *****************************************************************************/
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_m_OnBits]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_m_OnBits]
    GO
    /*****************************************************************************
    * Name: MD5_m_OnBits
    * Description: 常数组
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_m_OnBits(
      @i  TINYINT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      DECLARE @iRes  INT
      SELECT @iRes =
        CASE @i
          WHEN 0 THEN 1      -- 00000000000000000000000000000001
          WHEN 1 THEN 3      -- 00000000000000000000000000000011
          WHEN 2 THEN 7      -- 00000000000000000000000000000111
          WHEN 3 THEN 15      -- 00000000000000000000000000001111
          WHEN 4 THEN 31      -- 00000000000000000000000000011111
          WHEN 5 THEN 63      -- 00000000000000000000000000111111
          WHEN 6 THEN 127     -- 00000000000000000000000001111111
          WHEN 7 THEN 255     -- 00000000000000000000000011111111
          WHEN 8 THEN 511     -- 00000000000000000000000111111111
          WHEN 9 THEN 1023     -- 00000000000000000000001111111111
          WHEN 10 THEN 2047     -- 00000000000000000000011111111111
          WHEN 11 THEN 4095     -- 00000000000000000000111111111111
          WHEN 12 THEN 8191     -- 00000000000000000001111111111111
          WHEN 13 THEN 16383    -- 00000000000000000011111111111111
          WHEN 14 THEN 32767    -- 00000000000000000111111111111111
          WHEN 15 THEN 65535    -- 00000000000000001111111111111111
          WHEN 16 THEN 131071    -- 00000000000000011111111111111111
          WHEN 17 THEN 262143    -- 00000000000000111111111111111111
          WHEN 18 THEN 524287    -- 00000000000001111111111111111111
          WHEN 19 THEN 1048575   -- 00000000000011111111111111111111
          WHEN 20 THEN 2097151   -- 00000000000111111111111111111111
          WHEN 21 THEN 4194303   -- 00000000001111111111111111111111
          WHEN 22 THEN 8388607   -- 00000000011111111111111111111111
          WHEN 23 THEN 16777215   -- 00000000111111111111111111111111
          WHEN 24 THEN 33554431   -- 00000001111111111111111111111111
          WHEN 25 THEN 67108863   -- 00000011111111111111111111111111
          WHEN 26 THEN 134217727  -- 00000111111111111111111111111111
          WHEN 27 THEN 268435455  -- 00001111111111111111111111111111
          WHEN 28 THEN 536870911  -- 00011111111111111111111111111111
          WHEN 29 THEN 1073741823  -- 00111111111111111111111111111111
          WHEN 30 THEN 2147483647  -- 01111111111111111111111111111111
          ELSE 0
        END
      RETURN(@iRes)
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_m_2Power]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_m_2Power]
    GO
    /*****************************************************************************

     

    * Name: MD5_m_2Power
    * Description: 常数组
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_m_2Power(
      @i  TINYINT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      DECLARE @iRes  INT
      SELECT @iRes =
        CASE @i
          WHEN 0 THEN 1      -- 00000000000000000000000000000001
          WHEN 1 THEN 2      -- 00000000000000000000000000000010
          WHEN 2 THEN 4      -- 00000000000000000000000000000100
          WHEN 3 THEN 8      -- 00000000000000000000000000001000
          WHEN 4 THEN 16      -- 00000000000000000000000000010000
          WHEN 5 THEN 32      -- 00000000000000000000000000100000
          WHEN 6 THEN 64      -- 00000000000000000000000001000000
          WHEN 7 THEN 128     -- 00000000000000000000000010000000
          WHEN 8 THEN 256     -- 00000000000000000000000100000000
          WHEN 9 THEN 512     -- 00000000000000000000001000000000
          WHEN 10 THEN 1024     -- 00000000000000000000010000000000
          WHEN 11 THEN 2048     -- 00000000000000000000100000000000
          WHEN 12 THEN 4096     -- 00000000000000000001000000000000
          WHEN 13 THEN 8192     -- 00000000000000000010000000000000
          WHEN 14 THEN 16384    -- 00000000000000000100000000000000
          WHEN 15 THEN 32768    -- 00000000000000001000000000000000
          WHEN 16 THEN 65536    -- 00000000000000010000000000000000
          WHEN 17 THEN 131072    -- 00000000000000100000000000000000
          WHEN 18 THEN 262144    -- 00000000000001000000000000000000
          WHEN 19 THEN 524288    -- 00000000000010000000000000000000
          WHEN 20 THEN 1048576   -- 00000000000100000000000000000000
          WHEN 21 THEN 2097152   -- 00000000001000000000000000000000
          WHEN 22 THEN 4194304   -- 00000000010000000000000000000000
          WHEN 23 THEN 8388608   -- 00000000100000000000000000000000
          WHEN 24 THEN 16777216   -- 00000001000000000000000000000000
          WHEN 25 THEN 33554432   -- 00000010000000000000000000000000
          WHEN 26 THEN 67108864   -- 00000100000000000000000000000000
          WHEN 27 THEN 134217728  -- 00001000000000000000000000000000
          WHEN 28 THEN 268435456  -- 00010000000000000000000000000000
          WHEN 29 THEN 536870912  -- 00100000000000000000000000000000
          WHEN 30 THEN 1073741824  -- 01000000000000000000000000000000
          ELSE 0
        END
      RETURN(@iRes)
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_LShift]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_LShift]
    GO
    /*****************************************************************************
    * Name: MD5_LShift
    * Description: MD5_LShift
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_LShift(
       @iValue    INT
      ,@iShiftBits  TINYINT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      DECLARE @iRes  BIGINT
      SET @iRes = CAST(@iValue AS BINARY(8))
      SET @iRes = @iRes * dbo.MD5_m_2Power(@iShiftBits)
      RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_RShift]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_RShift]
    GO
    /*****************************************************************************
    * Name: MD5_RShift
    * Description: MD5_RShift
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_RShift(
       @iValue    INT
      ,@iShiftBits  TINYINT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      DECLARE @iRes  BIGINT
      SET @iRes = CAST(@iValue AS BINARY(8))
      SET @iRes = @iRes / dbo.MD5_m_2Power(@iShiftBits)
      RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_RotateLeft]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_RotateLeft]
    GO
    /*****************************************************************************
    * Name: MD5_RotateLeft
    * Description: MD5_RotateLeft
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_RotateLeft(
       @iValue    INT
      ,@iShiftBits  TINYINT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      RETURN(dbo.MD5_LShift(@iValue, @iShiftBits) | dbo.MD5_RShift(@iValue, (32 - @iShiftBits)))
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_AddUnsigned]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_AddUnsigned]
    GO
    /*****************************************************************************
    * Name: MD5_AddUnsigned
    * Description: MD5_AddUnsigned
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_AddUnsigned(
       @iX    INT
      ,@iY    INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      DECLARE @iRes  BIGINT
      SET @iRes = CAST(CAST(@iX AS BINARY(8)) AS BIGINT) + CAST(CAST(@iY AS BINARY(8)) AS BIGINT)
      RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_F]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_F]
    GO
    /*****************************************************************************
    * Name: MD5_F
    * Description: MD5_F
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_F(
       @x    INT
      ,@y    INT
      ,@z    INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      RETURN((@x & @y) | ((~@x) & @z))
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_G]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_G]
    GO
    /*****************************************************************************
    * Name: MD5_G
    * Description: MD5_G
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_G(
       @x    INT
      ,@y    INT
      ,@z    INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      RETURN((@x & @z) | (@y & (~@z)))
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_H]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_H]
    GO
    /*****************************************************************************
    * Name: MD5_H
    * Description: MD5_H
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_H(
       @x    INT
      ,@y    INT
      ,@z    INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      RETURN(@x ^ @y ^ @z)
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_I]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_I]
    GO
    /*****************************************************************************
    * Name: MD5_I
    * Description: MD5_I
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_I(
       @x    INT
      ,@y    INT
      ,@z    INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      RETURN(@y ^ (@x | (~@z)))
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_FF]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_FF]
    GO
    /*****************************************************************************
    * Name: MD5_FF
    * Description: MD5_FF
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_FF(
       @a    INT
      ,@b    INT
      ,@c    INT
      ,@d    INT
      ,@x    INT
      ,@s   INT
      ,@ac  INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_F(@b, @c, @d), @x), @ac))
      SET @a = dbo.MD5_RotateLeft(@a, @s)
      SET @a = dbo.MD5_AddUnsigned(@a, @b)
      RETURN(@a)
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_GG]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_GG]
    GO
    /*****************************************************************************
    * Name: MD5_GG
    * Description: MD5_GG
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_GG(
       @a    INT
      ,@b    INT
      ,@c    INT
      ,@d    INT
      ,@x    INT
      ,@s   INT
      ,@ac  INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_G(@b, @c, @d), @x), @ac))
      SET @a = dbo.MD5_RotateLeft(@a, @s)
      SET @a = dbo.MD5_AddUnsigned(@a, @b)
      RETURN(@a)
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_HH]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_HH]
    GO
    /*****************************************************************************
    * Name: MD5_HH
    * Description: MD5_HH
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_HH(
       @a    INT
      ,@b    INT
      ,@c    INT
      ,@d    INT
      ,@x    INT
      ,@s   INT
      ,@ac  INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_H(@b, @c, @d), @x), @ac))
      SET @a = dbo.MD5_RotateLeft(@a, @s)
      SET @a = dbo.MD5_AddUnsigned(@a, @b)
      RETURN(@a)
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_II]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_II]
    GO
    /*****************************************************************************
    * Name: MD5_II
    * Description: MD5_II
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_II(
       @a    INT
      ,@b    INT
      ,@c    INT
      ,@d    INT
      ,@x    INT
      ,@s   INT
      ,@ac  INT
    )
    RETURNS INT
    WITH ENCRYPTION
    AS
    BEGIN
      SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_I(@b, @c, @d), @x), @ac))
      SET @a = dbo.MD5_RotateLeft(@a, @s)
      SET @a = dbo.MD5_AddUnsigned(@a, @b)
      RETURN(@a)
    END
    GO

    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_ConvertToWordArray]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_ConvertToWordArray]
    GO
    /*****************************************************************************
    * Name: MD5_ConvertToWordArray
    * Description: MD5_ConvertToWordArray
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_ConvertToWordArray(
       @sOrigMess    VARCHAR(8000)  = ''''''''
    )
    RETURNS @tWordArray TABLE([ID] INT IDENTITY(0,1),[Word] INT)
    WITH ENCRYPTION
    AS
    BEGIN
      IF @sOrigMess IS NULL
        SET @sOrigMess = ''''''''


      DECLARE @iLenOfMess      INT
      DECLARE @iWordArrayLen    INT
      DECLARE @iPosOfWord      INT
      DECLARE @iPosOfMess      INT
      DECLARE @iCountOfWord    INT


      SET @iLenOfMess = LEN(@sOrigMess)
      SET @iWordArrayLen = ((@iLenOfMess + 8)/64 + 1) * 16
      SET @iCountOfWord = 0
      WHILE(@iCountOfWord<@iWordArrayLen)
      BEGIN
        INSERT INTO @tWordArray([Word]) VALUES(0)
        SET @iCountOfWord = @iCountOfWord + 1
      END


      SELECT @iPosOfMess = 0, @iPosOfWord = 0, @iCountOfWord = 0
      WHILE(@iPosOfMess < @iLenOfMess)
      BEGIN
        SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4
        UPDATE @tWordArray
          SET [Word] = [Word] | dbo.MD5_LShift(UNICODE(SUBSTRING(@sOrigMess,@iPosOfMess+1,1)),@iPosOfWord*8)
          WHERE [ID] = @iCountOfWord
        SET @iPosOfMess = @iPosOfMess + 1
      END
      
      SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4
      UPDATE @tWordArray
        SET [Word] = [Word] | dbo.MD5_LShift(0x80,@iPosOfWord*8)
        WHERE [ID] = @iCountOfWord


      UPDATE @tWordArray
        SET [Word] = [Word] | dbo.MD5_LShift(@iLenOfMess,3)
        WHERE [ID] = @iWordArrayLen - 2
      UPDATE @tWordArray
        SET [Word] = [Word] | dbo.MD5_RShift(@iLenOfMess,29)
        WHERE [ID] = @iWordArrayLen - 1
      RETURN
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5_WordToHex]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5_WordToHex]
    GO
    /*****************************************************************************
    * Name: MD5_WordToHex
    * Description: MD5_WordToHex
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5_WordToHex(
       @iValue    INT
    )
    RETURNS CHAR(8)
    WITH ENCRYPTION
    AS
    BEGIN
      DECLARE @sRes  VARCHAR(8)
      DECLARE @iTmp  INT
      DECLARE @iCount TINYINT


      SELECT @sRes = '''''''', @iCount = 0
      WHILE(@iCount<4)
      BEGIN
        SET @iTmp = dbo.MD5_RShift(@iValue,@iCount*8) & 0x000000FF
        SET @sRes = @sRes + CASE @iTmp / 16 WHEN 0 THEN ''''0''''
                          WHEN 1 THEN ''''1''''
                          WHEN 2 THEN ''''2''''
                          WHEN 3 THEN ''''3''''
                          WHEN 4 THEN ''''4''''
                          WHEN 5 THEN ''''5''''
                          WHEN 6 THEN ''''6''''
                          WHEN 7 THEN ''''7''''
                          WHEN 8 THEN ''''8''''
                          WHEN 9 THEN ''''9''''
                          WHEN 10 THEN ''''A''''
                          WHEN 11 THEN ''''B''''
                          WHEN 12 THEN ''''C''''
                          WHEN 13 THEN ''''D''''
                          WHEN 14 THEN ''''E''''
                          WHEN 15 THEN ''''F''''
                          ELSE '''''''' END
                 + CASE @iTmp % 16 WHEN 0 THEN ''''0''''
                          WHEN 1 THEN ''''1''''
                          WHEN 2 THEN ''''2''''
                          WHEN 3 THEN ''''3''''
                          WHEN 4 THEN ''''4''''
                          WHEN 5 THEN ''''5''''
                          WHEN 6 THEN ''''6''''
                          WHEN 7 THEN ''''7''''
                          WHEN 8 THEN ''''8''''
                          WHEN 9 THEN ''''9''''
                          WHEN 10 THEN ''''A''''
                          WHEN 11 THEN ''''B''''
                          WHEN 12 THEN ''''C''''
                          WHEN 13 THEN ''''D''''
                          WHEN 14 THEN ''''E''''
                          WHEN 15 THEN ''''F''''
                          ELSE '''''''' END
        SET @iCount = @iCount + 1
      END
      RETURN(@sRes)
    END
    GO


    IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''''[dbo].[MD5]'''') AND xtype IN(N''''FN'''', N''''IF'''', N''''TF''''))
      DROP FUNCTION [dbo].[MD5]
    GO
    /*****************************************************************************
    * Name: MD5
    * Description: MD5
    *****************************************************************************/
    CREATE FUNCTION dbo.MD5(
       @sOrigMess  NVARCHAR(4000)
    )
    RETURNS CHAR(32)
    WITH ENCRYPTION
    AS
    BEGIN
      --====================================
      DECLARE @S11 TINYINT
      DECLARE @S12 TINYINT
      DECLARE @S13 TINYINT
      DECLARE @S14 TINYINT
      DECLARE @S21 TINYINT
      DECLARE @S22 TINYINT
      DECLARE @S23 TINYINT
      DECLARE @S24 TINYINT
      DECLARE @S31 TINYINT
      DECLARE @S32 TINYINT
      DECLARE @S33 TINYINT
      DECLARE @S34 TINYINT
      DECLARE @S41 TINYINT
      DECLARE @S42 TINYINT
      DECLARE @S43 TINYINT
      DECLARE @S44 TINYINT


      SELECT @S11 = 7, @S12 = 12, @S13 = 17, @S14 = 22
      SELECT @S21 = 5, @S22 = 9, @S23 = 14, @S24 = 20
      SELECT @S31 = 4, @S32 = 11, @S33 = 16, @S34 = 23
      SELECT @S41 = 6, @S42 = 10, @S43 = 15, @S44 = 21
      --====================================
      DECLARE @a INT
      DECLARE @b INT
      DECLARE @c INT
      DECLARE @d INT
      DECLARE @AA  INT
      DECLARE @BB  INT
      DECLARE @CC  INT
      DECLARE @DD  INT


      SELECT  @a = 0x67452301
          ,@b = 0xEFCDAB89
          ,@c = 0x98BADCFE
          ,@d = 0x10325476
      --====================================

    SQL Server 2000的安全配置

          数据库是电子商务、金融以及ERP系统的基础,通常都保存着重要的商业伙伴和客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,他们用这些数据库保存一些个人资料,比如员工薪水、个人资料等等。数据库服务器还掌握着敏感的金融数据。包括交易记录、商业事务和帐号数据,战略上的或者专业的信息,比如专利和工程数据,甚至市场计划等等应该保护起来防止竞争者和其他非法者获取的资料。数据完整性和合法存取会受到很多方面的安全威胁,包括密码策略、系统后门、数据库操作以及本身的安全方案。但是数据库通常没有象操作系统和网络这样在安全性上受到重视。

          微软的SQL Server是一种广泛使用的数据库,很多电子商务网站、企业内部信息化平台等都是基于SQL Server上的,但是数据库的安全性还没有被人们更系统的安全性等同起来,多数管理员认为只要把网络和操作系统的安全搞好了,那么所有的应用程序也就安全了。大多数系统管理员对数据库不熟悉而数据库管理员有对安全问题关心太少,而且一些安全公司也忽略数据库安全,这就使数据库的安全问题更加严峻了。数据库系统中存在的安全漏洞和不当的配置通常会造成严重的后果,而且都难以发现。数据库应用程序通常同操作系统的最高管理员密切相关。广泛SQL Server数据库又是属于“端口”型的数据库,这就表示任何人都能够用分析工具试图连接到数据库上,从而绕过操作系统的安全机制,进而闯入系统、破坏和窃取数据资料,甚至破坏整个系统。

    这里,我们主要谈论有关SQL Server2000数据库的安全配置以及一些相关的安全和使用上的问题。

         在进行SQL Server 2000数据库的安全配置之前,首先你必须对操作系统进行安全配置,保证你的操作系统处于安全状态。然后对你要使用的操作数据库软件(程序)进行必要的安全审核,比如对ASP、PHP等脚本,这是很多基于数据库的WEB应用常出现的安全隐患,对于脚本主要是一个过滤问题,需要过滤一些类似 , ‘ ; @ / 等字符,防止破坏者构造恶意的SQL语句。接着,安装SQL Server2000后请打上补丁sp1以及最新的sp2。

    在做完上面三步基础之后,我们再来讨论SQL Server的安全配置。

    1、使用安全的密码策略

         我们把密码策略摆在所有安全配置的第一步,请注意,很多数据库帐号的密码过于简单,这跟系统密码过于简单是一个道理。对于sa更应该注意,同时不要让sa帐号的密码写于应用程序或者脚本中。健壮的密码是安全的第一步!

          SQL Server2000安装的时候,如果是使用混合模式,那么就需要输入sa的密码,除非你确认必须使用空密码。这比以前的版本有所改进。

         同时养成定期修改密码的好习惯。数据库管理员应该定期查看是否有不符合密码要求的帐号。比如使用下面的SQL语句:

    Use master

    Select name,Password from syslogins where password is null

    2、使用安全的帐号策略。

         由于SQL Server不能更改sa用户名称,也不能删除这个超级用户,所以,我们必须对这个帐号进行最强的保护,当然,包括使用一个非常强壮的密码,最好不要在数据库应用中使用sa帐号,只有当没有其它方法登录到 SQL Server 实例(例如,当其它系统管理员不可用或忘记了密码)时才使用 sa。建议数据库管理员新建立一个拥有与sa一样权限的超级用户来管理数据库。安全的帐号策略还包括不要让管理员权限的帐号泛滥。 SQL Server的认证模式有Windows身份认证和混合身份认证两种。如果数据库管理员不希望操作系统管理员来通过操作系统登陆来接触数据库的话,可以在帐号管理中把系统帐号“BUILTINAdministrators”删除。不过这样做的结果是一旦sa帐号忘记密码的话,就没有办法来恢复了。

        很多主机使用数据库应用只是用来做查询、修改等简单功能的,请根据实际需要分配帐号,并赋予仅仅能够满足应用要求和需要的权限。比如,只要查询功能的,那么就使用一个简单的public帐号能够select就可以了。

    3、加强数据库日志的记录。

         审核数据库登录事件的“失败和成功”,在实例属性中选择“安全性”,将其中的审核级别选定为全部,这样在数据库系统和操作系统日志里面,就详细记录了所有帐号的登录事件。

    请定期查看SQL Server日志检查是否有可疑的登录事件发生,或者使用DOS命令。

    findstr /C:"登录" d:Microsoft SQL ServerMSSQLLOG*.*

    4、管理扩展存储过程

         对存储过程进行大手术,并且对帐号调用扩展存储过程的权限要慎重。其实在多数应用中根本用不到多少系统的存储过程,而SQL Server的这么多系统存储过程只是用来适应广大用户需求的,所以请删除不必要的存储过程,因为有些系统的存储过程能很容易地被人利用起来提升权限或进行破坏。

    如果你不需要扩展存储过程xp_cmdshell请把它去掉。使用这个SQL语句:

    use master

    sp_dropextendedproc 'xp_cmdshell'

         xp_cmdshell是进入操作系统的最佳捷径,是数据库留给操作系统的一个大后门。如果你需要这个存储过程,请用这个语句也可以恢复过来。

    sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'

          如果你不需要请丢弃OLE自动存储过程(会造成管理器中的某些特征不能使用),这些过程包括如下:

    Sp_OACreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty

    Sp_OAMethod Sp_OASetProperty Sp_OAStop

          去掉不需要的注册表访问的存储过程,注册表存储过程甚至能够读出操作系统管理员的密码来,如下:

    Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue Xp_regenumvalues

    Xp_regread Xp_regremovemultistring Xp_regwrite

    还有一些其他的扩展存储过程,你也最好检查检查。

    使用系统帐户登陆查询分析器
    运行以下脚本
    use master
    exec sp_dropextendedproc 'xp_cmdshell'
    exec sp_dropextendedproc 'xp_dirtree'
    exec sp_dropextendedproc 'xp_enumgroups'
    exec sp_dropextendedproc 'xp_fixeddrives'
    exec sp_dropextendedproc 'xp_loginconfig'
    exec sp_dropextendedproc 'xp_enumerrorlogs'
    exec sp_dropextendedproc 'xp_getfiledetails'
    exec sp_dropextendedproc 'Sp_OACreate'
    exec sp_dropextendedproc 'Sp_OADestroy'
    exec sp_dropextendedproc 'Sp_OAGetErrorInfo'
    exec sp_dropextendedproc 'Sp_OAGetProperty'
    exec sp_dropextendedproc 'Sp_OAMethod'
    exec sp_dropextendedproc 'Sp_OASetProperty'
    exec sp_dropextendedproc 'Sp_OAStop'
    exec sp_dropextendedproc 'Xp_regaddmultistring'
    exec sp_dropextendedproc 'Xp_regdeletekey'
    exec sp_dropextendedproc 'Xp_regdeletevalue'
    exec sp_dropextendedproc 'Xp_regenumvalues'
    exec sp_dropextendedproc 'Xp_regread'
    exec sp_dropextendedproc 'Xp_regremovemultistring'
    exec sp_dropextendedproc 'Xp_regwrite'
    drop procedure sp_makewebtask
    go
    删除所有危险的扩展.

    在处理存储过程的时候,请确认一下,避免造成对数据库或应用程序的伤害。

    5、使用协议加密

         SQL Server 2000使用的Tabular Data Stream协议来进行网络数据交换,如果不加密的话,所有的网络传输都是明文的,包括密码、数据库内容等等,这是一个很大的安全威胁。能被人在网络中截获到他们需要的东西,包括数据库帐号和密码。所以,在条件容许情况下,最好使用SSL来加密协议,当然,你需要一个证书来支持。

    6、不要让人随便探测到你的TCP/IP端口

         默认情况下,SQL Server使用1433端口监听,很多人都说SQL Server配置的时候要把这个端口改变,这样别人就不能很容易地知道使用的什么端口了。可惜,通过微软未公开的1434端口的UDP探测可以很容易知道SQL Server使用的什么TCP/IP端口了(请参考《深入探索SQL Server网络连接的安全问题》)。 不过微软还是考虑到了这个问题,毕竟公开而且开放的端口会引起不必要的麻烦。在实例属性中选择TCP/IP协议的属性。选择隐藏 SQL Server 实例。如果隐藏了 SQL Server 实例,则将禁止对试图枚举网络上现有的 SQL Server 实例的客户端所发出的广播作出响应。这样,别人就不能用1434来探测你的TCP/IP端口了(除非用Port Scan)。

    7、修改TCP/IP使用的端口

         请在上一步配置的基础上,更改原默认的1433端口。在实例属性中选择网络配置中的TCP/IP协议的属性,将TCP/IP使用的默认端口变为其他端口。

    8、拒绝来自1434端口的探测

         由于1434端口探测没有限制,能够被别人探测到一些数据库信息,而且还可能遭到DOS攻击让数据库服务器的CPU负荷增大,所以对Windows 2000操作系统来说,在IPSec过滤拒绝掉1434端口的UDP通讯,可以尽可能地隐藏你的SQL Server。

    9、对网络连接进行IP限制

         SQL Server 2000数据库系统本身没有提供网络连接的安全解决办法,但是Windows 2000提供了这样的安全机制。使用操作系统自己的IPSec可以实现IP数据包的安全性。请对IP连接进行限制,只保证自己的IP能够访问,也拒绝其他IP进行的端口连接,把来自网络上的安全威胁进行有效的控制。

         上面主要介绍的一些SQL Server的安全配置,经过以上的配置,可以让SQL Server本身具备足够的安全防范能力。当然,更主要的还是要加强内部的安全控制和管理员的安全培训,而且安全性问题是一个长期的解决过程,还需要以后进行更多的安全维护。

    精妙的sql语句

    说明:复制表(只复制结构,源表名:a 新表名:b)

    SQL: select * into b from a where 1<>1

    说明:拷贝表(拷贝数据,源表名:a 目标表名:b)

    SQL: insert into b(a, b, c) select d,e,f from b;

    说明:显示文章、提交人和最后回复时间

    SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    说明:外连接查询(表名1:a 表名2:b)

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    说明:日程安排提前五分钟提醒

    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    说明:两张关联表,删除主表中已经在副表中没有的信息

    SQL:

    delete from info where not exists ( select * from infobz where info.infid=infobz.infid )

    说明:--

    SQL:

    SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

    FROM TABLE1,

    (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

    FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

    FROM TABLE2

    WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,

    (SELECT NUM, UPD_DATE, STOCK_ONHAND

    FROM TABLE2

    WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =

    TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,

    WHERE X.NUM = Y.NUM (+)

    AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B

    WHERE A.NUM = B.NUM

    说明:--

    SQL:

    select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩

    说明:

    从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)

    SQL:

    SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,

    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC

    FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration

    FROM TELFEESTAND a, TELFEE b

    WHERE a.tel = b.telfax) a

    GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')

    说明:四表联查问题:

    SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    说明:得到表中最小的未使用的ID号

    SQL:

    SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID

    FROM Handle

    WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)

    SQL语句集锦

    --语 句 功 能
    --数据操作
    SELECT --从数据库表中检索数据行和列
    INSERT --向数据库表添加新数据行
    DELETE --从数据库表中删除数据行
    UPDATE --更新数据库表中的数据
    --数据定义
    CREATE TABLE --创建一个数据库表
    DROP TABLE --从数据库中删除表
    ALTER TABLE --修改数据库表结构
    CREATE VIEW --创建一个视图
    DROP VIEW --从数据库中删除视图
    CREATE INDEX --为数据库表创建一个索引
    DROP INDEX --从数据库中删除索引
    CREATE PROCEDURE --创建一个存储过程
    DROP PROCEDURE --从数据库中删除存储过程
    CREATE TRIGGER --创建一个触发器
    DROP TRIGGER --从数据库中删除触发器
    CREATE SCHEMA --向数据库添加一个新模式
    DROP SCHEMA --从数据库中删除一个模式
    CREATE DOMAIN --创建一个数据值域
    ALTER DOMAIN --改变域定义
    DROP DOMAIN --从数据库中删除一个域
    --数据控制
    GRANT --授予用户访问权限
    DENY --拒绝用户访问
    REVOKE --解除用户访问权限
    --事务控制
    COMMIT --结束当前事务
    ROLLBACK --中止当前事务
    SET TRANSACTION --定义当前事务数据访问特征
    --程序化SQL
    DECLARE --为查询设定游标
    EXPLAN --为查询描述数据访问计划
    OPEN --检索查询结果打开一个游标
    FETCH --检索一行查询结果
    CLOSE --关闭游标
    PREPARE --为动态执行准备SQL 语句
    EXECUTE --动态地执行SQL 语句
    DESCRIBE --描述准备好的查询


    ---局部变量
    declare @id char(10)
    --set @id = '10010001'
    select @id = '10010001'


    ---全局变量
    ---必须以@@开头


    --IF ELSE
    declare @x int @y int @z int
    select @x = 1 @y = 2 @z=3
    if @x > @y
    print 'x > y' --打印字符串'x > y'
    else if @y > @z
    print 'y > z'
    else print 'z > y'


    --CASE
    use pangu
    update employee
    set e_wage =
    case
    when job_level = ’1’ then e_wage*1.08
    when job_level = ’2’ then e_wage*1.07
    when job_level = ’3’ then e_wage*1.06
    else e_wage*1.05
    end


    --WHILE CONTINUE BREAK
    declare @x int @y int @c int
    select @x = 1 @y=1
    while @x < 3
    begin
    print @x --打印变量x 的值
    while @y < 3
    begin
    select @c = 100*@x + @y
    print @c --打印变量c 的值
    select @y = @y + 1
    end
    select @x = @x + 1
    select @y = 1
    end


    --WAITFOR
    --例 等待1 小时2 分零3 秒后才执行SELECT 语句
    waitfor delay ’01:02:03’
    select * from employee
    --例 等到晚上11 点零8 分后才执行SELECT 语句
    waitfor time ’23:08:00’
    select * from employee



    ***SELECT***


    select *(列名) from table_name(表名) where column_name operator value
    ex:(宿主)
    select * from stock_information where stockid = str(nid)
    stockname = 'str_name'
    stockname like '% find this %'
    stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
    stockname like '[^F-M]%' --------- (^排除指定范围)
    --------- 只能在使用like关键字的where子句中使用通配符)
    or stockpath = 'stock_path'
    or stocknumber < 1000
    and stockindex = 24
    not stock*** = 'man'
    stocknumber between 20 and 100
    stocknumber in(10,20,30)
    order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
    order by 1,2 --------- by列号
    stockname = (select stockname from stock_information where stockid = 4)
    --------- 子查询
    --------- 除非能确保内层select只返回一个行的值,
    --------- 否则应在外层where子句中用一个in限定符
    select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
    select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
    select stockname , "stocknumber" = count(*) from table_name group by stockname
    --------- group by 将表按行分组,指定列中有相同的值
    having count(*) = 2 --------- having选定指定的组

    select *
    from table1, table2
    where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
    table1.id =* table2.id -------- 右外部连接


    select stockname from table1
    union [all] ----- union合并查询结果集,all-保留重复行
    select stockname from table2


    ***insert***


    insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
    value (select Stockname , Stocknumber from Stock_table2)---value为select语句


    ***update***


    update table_name set Stockname = "xxx" [where Stockid = 3]
    Stockname = default
    Stockname = null
    Stocknumber = Stockname + 4


    ***delete***


    delete from table_name where Stockid = 3
    truncate table_name ----------- 删除表中所有行,仍保持表的完整性
    drop table table_name --------------- 完全删除表


    ***alter table*** --- 修改数据库表结构


    alter table database.owner.table_name add column_name char(2) null .....
    sp_help table_name ---- 显示表已有特征
    create table table_name (name char(20), age smallint, lname varchar(30))
    insert into table_name select ......... ----- 实现删除列的方法(创建新表)
    alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束

    ***function(/*常用函数*/)***


    ----统计函数----
    AVG --求平均值
    COUNT --统计数目
    MAX --求最大值
    MIN --求最小值
    SUM --求和


    --AVG
    use pangu
    select avg(e_wage) as dept_avgWage
    from employee
    group by dept_id


    --MAX
    --求工资最高的员工姓名
    use pangu
    select e_name
    from employee
    where e_wage =
    (select max(e_wage)
    from employee)


    --STDEV()
    --STDEV()函数返回表达式中所有数据的标准差


    --STDEVP()
    --STDEVP()函数返回总体标准差


    --VAR()
    --VAR()函数返回表达式中所有值的统计变异数


    --VARP()
    --VARP()函数返回总体变异数


    ----算术函数----


    /***三角函数***/
    SIN(float_expression) --返回以弧度表示的角的正弦
    COS(float_expression) --返回以弧度表示的角的余弦
    TAN(float_expression) --返回以弧度表示的角的正切
    COT(float_expression) --返回以弧度表示的角的余切
    /***反三角函数***/
    ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
    ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
    ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
    ATAN2(float_expression1,float_expression2)
    --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
    DEGREES(numeric_expression)
    --把弧度转换为角度返回与表达式相同的数据类型可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    EXP(float_expression) --返回表达式的指数值
    LOG(float_expression) --返回表达式的自然对数值
    LOG10(float_expression)--返回表达式的以10 为底的对数值
    SQRT(float_expression) --返回表达式的平方根
    /***取近似值函数***/
    CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据
    --类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
    ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
    --与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
    PI() --返回值为π 即3.1415926535897936
    RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数



    ----字符串函数----
    ASCII() --函数返回字符表达式最左端字符的ASCII 码值
    CHAR() --函数用于将ASCII 码转换为字符
    --如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
    LOWER() --函数把字符串全部转换为小写
    UPPER() --函数把字符串全部转换为大写
    STR() --函数把数值型数据转换为字符型数据
    LTRIM() --函数把字符串头部的空格去掉
    RTRIM() --函数把字符串尾部的空格去掉
    LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
    CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
    SOUNDEX() --函数返回一个四位字符码
    --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值
    DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
    --0 两个SOUNDEX 函数返回值的第一个字符不同
    --1 两个SOUNDEX 函数返回值的第一个字符相同
    --2 两个SOUNDEX 函数返回值的第一二个字符相同
    --3 两个SOUNDEX 函数返回值的第一二三个字符相同
    --4 两个SOUNDEX 函数返回值完全相同


    QUOTENAME() --函数返回被特定字符括起来的字符串
    /*select quotename('abc', '{') quotename('abc')
    运行结果如下
    ----------------------------------{
    {abc} [abc]*/


    REPLICATE() --函数返回一个重复character_expression 指定次数的字符串
    /*select replicate('abc', 3) replicate( 'abc', -2)
    运行结果如下
    ----------- -----------
    abcabcabc NULL*/


    REVERSE() --函数将指定的字符串的字符排列顺序颠倒
    REPLACE() --函数返回被替换了指定子串的字符串
    /*select replace('abc123g', '123', 'def')
    运行结果如下
    ----------- -----------
    abcdefg*/


    SPACE() --函数返回一个有指定长度的空白字符串
    STUFF() --函数用另一子串替换字符串指定位置长度的子串



    ----数据类型转换函数----
    CAST() 函数语法如下
    CAST() (<expression> AS <data_ type>[ length ])
    CONVERT() 函数语法如下
    CONVERT() (<data_ type>[ length ], <expression> [, style])


    select cast(100+99 as char) convert(varchar(12), getdate())
    运行结果如下
    ------------------------------ ------------
    199 Jan 15 2000


    ----日期函数----
    DAY() --函数返回date_expression 中的日期值
    MONTH() --函数返回date_expression 中的月份值
    YEAR() --函数返回date_expression 中的年份值
    DATEADD(<datepart> ,<number> ,<date>)
    --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
    DATEDIFF(<datepart> ,<number> ,<date>)
    --函数返回两个指定日期在datepart 方面的不同之处
    DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分
    DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分
    GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间


    ----系统函数----
    APP_NAME() --函数返回当前执行的应用程序的名称
    COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值
    COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值
    COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名
    DATALENGTH() --函数返回数据表达式的数据的实际长度
    DB_ID(['database_name']) --函数返回数据库的编号
    DB_NAME(database_id) --函数返回数据库的名称
    HOST_ID() --函数返回服务器端计算机的名称
    HOST_NAME() --函数返回服务器端计算机的名称
    IDENTITY(<data_type>[, seed increment]) [AS column_name])
    --IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中
    /*select identity(int, 1, 1) as column_name
    into newtable
    from oldtable*/
    ISDATE() --函数判断所给定的表达式是否为合理日期
    ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换
    ISNUMERIC() --函数判断所给定的表达式是否为合理的数值
    NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值
    NULLIF(<expression1>, <expression2>)
    --NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值