发布新日志

  • 存储过程解密工具

    2011-04-25 10:18:00

  • jira 重新搭建总结

    2010-09-28 14:38:31

  • testlink+jira+confluence最新破解安装

    2010-09-19 11:06:33

    一、安装
    1、因为jira运行在java环境下的,所以我们需要jdk的安装。jira是一个很好的错误跟踪软件,而confluence是一个java的wiki软件。
    所需要的程序:
    a、mysql 最好的5.0以上的版本
    b、mysql驱动,我这里用的是mysql-connector-java-5.0.3-bin.jar
    c、jdk最好1.4以上,我用的是jdk-1.6.0_12
    d、官方下载jira3.13.5.Enterprise - Standalone(linux)
    e、破解工程附件 alassian-extras-1.17.jar
    f、破解工程文件keygen.jar
    g、官方下载confluence-3.0.2-std.tar.gz
    h、confluence汉化包confluence-zh_CN-plugin-2.8.0.jar
    1)安装jdk
    下载地址:www.java.org
    注意:在安装新的jdk前l要看系统是否有自带的jdk程序,如果有必须删除。操作方法:rpm -qa | grep java
    如果出现java的安装软件,那要删除,操作方法:rpm -e 上面所列出的文件名称。这样就直接删除了系统中自带的jdk了。
    然后在安装jdk,这里以 JDK1.6位例来做,比如我们文件放置在/backup/soft下。
    我们进入/backup/soft下,#cd /backup/soft
    #chown +x jdk-1_6_0_12-linux-i586 增加它的可执行权限
    #./jdk-1_6_0_12-linux-i586 一路按空格键,当出现yes or no时,输入yes然后回车。
    Jdk就安装完成了,接下来我们设置环境变量
    #vi /etc/profile
    在文件最后添加
    #-----------------------------jdk start--------------------
    JAVA_HOME=/usr/local/jdk1.6.0_12
    JRE_HOME=/usr/local/jdk1.6.0_12/jre
    CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/too ls.jar
    PATH=$PATH:/usr/local/jdk1.6.0_12/bin
    export JAVA_HOME JRE_HOME CLASSPATH PATH
    #-------------------------------jdk end--------------------
    保存退出
    #source /etc/profile 使设置的环境变量能够立时生效
    #java -version 如果出现如内容,表示安装成功,否则从第一步看是检查
    [root@localhost /]# java -version
    java version "1.6.0_12"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0_12-b03)
    Java HotSpot(TM) Client VM (build 1.6.0_12-b03, mixed mode, sharing)
    至此我们的jdk服务就已经安装完毕。
    2、安装mysql
    下载地址:www.mysql.com
    cd /usr/local/
    tar -zvxf mysql-max-5.0.27-linux-i686-glibc23.tar.gz
    mkdir -p /usr/local/mysql (省略也可)
    cp -r mysql-max-5.0.27-linux-i686-glibc23.tar.gz /usr/local/mysql
    cp /usr/local/mysql /support-files/my-medium.cnf /etc/my.cnf
    添加mysql用户及用户组
    groupadd mysql
    useradd -g mysql mysql
    修改mysql目录权限
    chown -R root /usr/local/mysql
    chgrp -R mysql /usr/local/mysql
    chown -R mysql /usr/local/mysql /data
    生成mysql系统数据库
    /usr/local/mysql /mysql/scripts/mysql_install_db --user=mysql&
    启动mysql服务
    # /export1/server/mysql/bin/mysqld_safe --user=mysql&
    修改 mysql 的 root 密码
    # /export1/server/mysql/bin/mysqladmin -u root password "123456"
    OK这样就更改完成,不过mysql安装完成后有一个匿名用户,这个用户是不用密码就能登陆的。我们首先要删除这个匿名用户。
    # /export1/server/mysql/bin/mysql -u root -p
    password:123456
    进入后我们重新加载授权表。
    mysql>flush privileges;
    返回如下信息表示成功:Query ok, 0 row affected (0.00 sec)
    删除匿名用户.
    Mysql>use mysql;
    Mysql>DELETE from user WHERE user=’‘;
    返回如下信息:Query OK, 2 rows affected (0.00 sec)表示成功。
    然后重新启动mysql。这样匿名用户就不能登陆mysql服务器了。
    添加用户权限:
    使用GRANT语句添加一个可以从本地主机连接到mysql服务器的
    超级用户root,但是连接必须使用口令123456
    mysql>GRANT ALL loader="maincp" location="entitydefs/fieldtype-mysql.xml"/>调到这一段的最上一行。
    然后打开/usr/local/jira/conf/server.xml
    <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"...
    这大段修改为:
    <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
    username="root"
    password="密码"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost/jiradb?autoReconnect=t rue&useUnicode=true&characterEncoding=UTF8& amp;mysqlEncoding=utf8"
    minEvictableIdleTimeMillis="4000"
    timeBetweenEvictionRunsMillis="5000"
    maxActive="20" />
    如果是mysql5.0 拿去数据源驱动名称要修改为org.gjt.mm.mysql.Driver,这个数据库的路径是我这个包所打的路径。
    然后进入mysql中创建jiradb数据库
    /usr/local/mysql/bin/mysql -uroot -p
    输入密码,进入mysql,创建数据库。
    create database jiradb;
    然后运行jira
    cd /usr/local/jira/bin
    ./catalina.sh run #我启动的是调试模式,看可以查看运行的状态。
  • JIRA安装与破解

    2010-09-19 10:56:54

    JIRA安装与破解

    弄了好几天,光是安装就不行。终于终于安装上了,看来还是要参照别人的,自己弄不是忘这里就是忘那里。所有的安装说明都忘记了最关键建数据源呀。如下:

     

    环境 :windows,MS SQLServer2000,Tomcat5.0.28 (都一样,分别在 jira 生成的 war 上)
    1.
    安装 JDK, 配置 java 运行环境 ;
    2.
    安装 MS SQLServer2000 数据库,记着要安装 MS SQLServer2000 Service Pack4
    2.1
    安装过程要自定义 , 选择 chinese_RPC 排序方式 , 语言为 simple chinese;
    2.2
    身份验证选择混合模式 ;
    3.
    然后创建 jiradb jirauser ,创建 jirauser 的过程中要先创建一个登录名 jirauser ;把 public dbo 角色赋给 jirauser, 不要将 jirauser 作为 dbower
    4.
    JIRA zip 包文件解压缩到硬盘中(不要使用 windowsXP 自带的 unzip 功能!);
    5.
    编辑 edit-webapp/WEB-INF/classes/entityengine.xml 文件 , <datasource> 标签内的 field-type-name 属性的值设置为 mssql ;
    <datasource name="defaultDS"
    helper-class="org.ofbiz.core.entity.GenericHelperDAO"
    field-type-name="mssql"
    check-on-start="true"
    use-foreign-keys="false"
    use-foreign-key-indices="false"
    check-fks-on-start="false"
    check-fk-indices-on-start="false"
    add-missing-on-start="true">
    <jndi-jdbc jndi-server-name="default"
    jndi-name="java:comp/env/jdbc/JiraDS" />

    </datasource>
    这里红体字部分最关键是要建数据源名称为 jdbc/JiraDS (自己可以根据上面随便),建完 test 一下看能否测试成功。
    然后 , 找到 :
    <transaction-factory class="org.ofbiz.core.entity.transaction.JNDIFactory"> <user-transaction-jndi jndi-server-name="default" jndi-name="java:comp/UserTransaction"/> <transaction-manager-jndi jndi-server-name="default" jndi-name="java:comp/UserTransaction"/> </transaction-factory>
    修改为 :
    <transaction-factory class="org.ofbiz.core.entity.transaction.JNDIFactory">
    <user-transaction-jndi jndi-server-name="default" jndi-name="java:comp/env/UserTransaction"/>
    <transaction-manager-jndi jndi-server-name="default" jndi-name="java:comp/env/UserTransaction"/>
    </transaction-factory>
    6.Build JIRA
    7.Update Tomcat Libraries,download jira-jars-tomcat5.zip,
    解压缩后将 jar 文件拷贝到 Tomcat common/lib/ 目录下 ;
    8.Configure Tomcat
    8.1. Copy dist-tomcat/tomcat-5.5/jira.xml from the built JIRA distribution to your Tomcat's conf/Catalina/localhost/ directory;
    8.2.
    修改 jira.xml 文件内容 :
    <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
    username="jirauser"
    password="jira"
    driverClassName="net.sourceforge.jtds.jdbc.Driver"
    url="jdbc:jtds:sqlserver://localhost:1433/jiradb"/>

    说明你建的数据库名称为 jiradb ,数据库的登录用户为 jirauser ,密码为 jira 。要建的数据源的名称为 jdbc/JiraDS
    9. Modify Tomcat server.xml
    In order for JIRA to correctly display internationalized characters in user and group names you need to modify your Tomcat distributions conf/server.xml file. You need to set the property useBodyEncodingForURI="true" within the connector definition for your http protocol. The connector block should look very much like this:
    <Connector port="8080" maxHttpHeaderSize="8192"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true"/>
    修改为 :
    <Connector port="8080" maxHttpHeaderSize="8192"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true"/>
    10. Start Tomcat
    JIRA should now be ready to run in Tomcat. To start using JIRA, first start (or restart) the Tomcat server with Tomcat's bin/startup.(sh|bat) scripts, and point your browser to http://localhost:8080/jira
        
    这时候就会看到安装页面,当然还有认证。看到认证,我们就知道试用才一个月呀,就感觉很不爽,就要想着多用用。自己用用就算了,公司要使用坚决要买正版(严重支持正版!)。破解要自己破解也不是很难就是比较麻烦。我先是按照网络上的一些方法破解,但是好累,好不容易搞好了,结果还原 jar 包的时候出了问题,兴高采烈的覆盖了原来的 jar ,结果······结果是 tomcat 找不到 jira 了。郁闷 ing ···

    没办法了,就只好求助注册文件了,还好还好。绝对是好的东东

    在这里郑重推荐 http://crackzplanet.com/

    所有最新的,你想要的,你不想要的破解文件,注册文件,你都可以在这里找到(当然也有找不到 ** )。关键一个字新。这里的破解和注册很可能就是你想要的。

    最后一个问题就是下载好了注册文件注册的时候要注意,破解文件和你安装的版本一定要对应,不对应 License 验证会有错误的。破解的时候注意了(难点就是你下载的只是一个 .class 文件)你要 java 的时候可能找不到使用 jar 包内的类或者方法。好办?!找到相对应的 jar 包解压缩,然后将 keygen.class 文件拷贝到下面,然后 java 执行,马上就可以看到你自己的 License

    哈哈祝福你了呀!不过个人玩玩就算了,不要真的让公司用呀!公司还是要买正版滴,用着放心,客户舒心呀!

  • TOMCAT5+MYSQL5+JIRA3.6.4配置说明

    2010-09-19 10:52:46

     转自:http://ning94lihua2006.spaces.live.com/blog/cns!A69C39C0C3E03858!140.entry

    TOMCAT5+MYSQL5+JIRA3.6.4配置说明

    1、安装MYSQL数据库,本文假定安装目录是d:\mysql
    2、在MYSQL中创建数据库
       开始 -> 运行->输入cmd,按确定打开dos窗口
       在命令行下输入
       c:\>d:
       d:\>cd d:\mysql\bin
       d:\mysql\bin>mysql -uroot -p
       Enter password:  //第一安装没有密码,可直接回车  
       Welcome to the MySQL monitor.  Commands end with ; or \g.
       Your MySQL connection id is 47 to server version: 5.0.0-alpha-n

       Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
       mysql> create database jira;
       mysql> use jira;
       mysql> show tables;
       mysql> exit;

    3、解压jira企业版到硬盘中,本文假定存放目录为d:\jira3.6.4
       打开文件 D:\jira3.6.4\edit-webapp\WEB-INF\classes\entityengine.xml,修改之
       段落1
       原文
       <datasource name="defaultDS"
          helper-class="org.ofbiz.core.entity.GenericHelperDAO"
          field-type-name="hsql"
          check-on-start="true"
          use-foreign-keys="false"
          use-foreign-key-indices="false"
          check-fks-on-start="false"
          check-fk-indices-on-start="false"
          add-missing-on-start="true">
          <jndi-jdbc jndi-server-name="default"
          jndi-name="java:comp/env/jdbc/JiraDS" />
       </datasource>
       修改文
       <datasource name="defaultDS"
          helper-class="org.ofbiz.core.entity.GenericHelperDAO"
          field-type-name="mysql"
          check-on-start="true"
          use-foreign-keys="false"
          use-foreign-key-indices="false"
          check-fks-on-start="false"
          check-fk-indices-on-start="false"
          add-missing-on-start="true">
          <jndi-jdbc jndi-server-name="default"
          jndi-name="java:comp/env/jdbc/JiraDS" />
       </datasource>
       段落2
       原文
       <transaction-factory class="org.ofbiz.core.entity.transaction.JNDIFactory">
       <user-transaction-jndi jndi-server-name="default" jndi-name="java:comp/UserTransaction"/>
       <transaction-manager-jndi jndi-server-name="default" jndi-name="java:comp/UserTransaction"/>
       </transaction-factory>
       修改文
       <transaction-factory class="org.ofbiz.core.entity.transaction.JNDIFactory">
       <user-transaction-jndi jndi-server-name="default" jndi-name="java:comp/env/UserTransaction"/>
       <transaction-manager-jndi jndi-server-name="default" jndi-name="java:comp/env/UserTransaction"/>
       </transaction-factory>
    4、编译jira
       d:\mysql\bin>cd\
       d:\>cd jira3.6.4
       d:\jira3.6.4>build
    5、拷贝配置文件
       将D:\jira3.6.4\dist-tomcat\tomcat-5.5\jira.xml 文件拷贝到%TOMCAT_HOME%\conf\Catalina\localhost中,本文作者的TOMCAT_HOME为D:\apache-tomcat-5.5.15\
       修改如下:
       原文:
       <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
                username="sa"
                password=""
                driverClassName="org.hsqldb.jdbcDriver"
                url="jdbc:hsqldb:D:\jira3.6.4/database/jiradb"
                minEvictableIdleTimeMillis="4000"
                timeBetweenEvictionRunsMillis="5000"/>
       修改文
       <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
                username="root"
                password=""
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://localhost/jira?useUnicode=true"
                minEvictableIdleTimeMillis="4000"
                timeBetweenEvictionRunsMillis="5000"/>
    6、修改TOMCAT配置文件:server.xml
       原文
       <Connector port="8080" maxHttpHeaderSize="8192"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           connectionTimeout="20000" disableUploadTimeout="true"/>
       修改文
       <Connector port="8080" maxHttpHeaderSize="8192"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true"/>
    7、拷贝jira下的tomcat架包
       解压jira-jars-tomcat5.zip,将其中的jar文件拷贝到%TOMCAT_HOME%\common\lib下
    8、拷贝mysql的jdbc驱动包到tomcat的%TOMCAT_HOME%\common\lib下
    9、启动tomcat,打开ie在地址栏中输入http://localhost:8080/jira
    备注:
    遇到过如下问题:
    执行tomcat的启动文件startup.bat失败
    解决办法,在环境变量中添加tomcat变量,变量名:CATALINA_HOME,值:D:\apache-tomcat-5.5.15

  • 数据库自动备份

    2009-09-12 09:18:58

    MS SQL server 2005(SQL2005)在查询分析器里面备份 数据库的语句2008年05月12日 星期一 16:33(转)

    --完整备份
    Backup Database NorthwindCS
    To disk='G:\Backup\NorthwindCS_Full_20070908.bak'

    --差异备份
    Backup Database NorthwindCS
    To disk='G:\Backup\NorthwindCS_Diff_20070908.bak'
    With Differential

    --日志备份,默认截断日志
    Backup Log NorthwindCS
    To disk='G:\Backup\NorthwindCS_Log_20070908.bak'

    --日志备份,不截断日志
    Backup Log NorthwindCS
    To disk='G:\Backup\NorthwindCS_Log_20070908.bak'
    With No_Truncate

    --截断日志不保留
    Backup Log NorthwindCS
    With No_Log

    --或者
    Backup Log NorthwindCS
    With Truncate_Only
    --截断之后日志文件不会变小
    --有必要可以进行收缩

    --文件备份
    Exec Sp_Helpdb NorthwindCS --查看数据文件
    Backup Database NorthwindCS
    File='NorthwindCS'   --数据文件的逻辑名
    To disk='G:\Backup\NorthwindCS_File_20070908.bak'

    --文件组备份
    Exec Sp_Helpdb NorthwindCS --查看数据文件
    Backup Database NorthwindCS
    FileGroup='Primary'   --数据文件的逻辑名
    To disk='G:\Backup\NorthwindCS_FileGroup_20070908.bak'
    With init

    --分割备份到多个目标
    --恢复的时候不允许丢失任何一个目标
    Backup Database NorthwindCS
    To disk='G:\Backup\NorthwindCS_Full_1.bak'
         ,disk='G:\Backup\NorthwindCS_Full_2.bak'

    --镜像备份
    --每个目标都是相同的
    Backup Database NorthwindCS
    To disk='G:\Backup\NorthwindCS_Mirror_1.bak'
    Mirror
    To disk='G:\Backup\NorthwindCS_Mirror_2.bak'
    With Format --第一次做镜像备份的时候格式化目标

    --镜像备份到本地和远程
    Backup Database NorthwindCS
    To disk='G:\Backup\NorthwindCS_Mirror_1.bak'
    Mirror
    To disk='\\192.168.1.200\Backup\NorthwindCS_Mirror_2.bak'
    With Format

    --每天生成一个备份文件
    Declare @Path Nvarchar(2000)
    Set @Path ='G:\Backup\NorthwindCS_Full_'
    +Convert(Nvarchar,Getdate(),112)+'.bak'

    Backup Database NorthwindCS
    To disk=@Path


    --从NoRecovery或者
    --Standby模式恢复数据库为可用
    Restore Database NorthwindCS_Bak
    With Recovery

    --查看目标备份中的备份集
    Restore HeaderOnly
    From Disk ='G:\Backup\NorthwindCS_Full_20070908.bak'

    --查看目标备份的第一个备份集的信息
    Restore FileListOnly
    From Disk ='G:\Backup\NorthwindCS_Full_20070908_2.bak'
    With File=1

    --查看目标备份的卷标
    Restore LabelOnly
    From Disk ='G:\Backup\NorthwindCS_Full_20070908_2.bak'

    --备份设置密码保护备份
    Backup Database NorthwindCS
    To disk='G:\Backup\NorthwindCS_Full_20070908.bak'
    With Password = '123',init

    Restore Database NorthwindCS
    From disk='G:\Backup\NorthwindCS_Full_20070908.bak'
    With Password = '123'
     
    -----------------------数据库自动备份----------------------

    DECLARE @strPath NVARCHAR(200)

    set @strPath = convert(NVARCHAR(19),getdate(),120)

    set @strPath = REPLACE(@strPath, ':' , '.')

    set @strPath = 'D:\temp\' + 'ehr_data'+@strPath + '.bak'

    BACKUP DATABASE [ehr_data] TO DISK = @strPath WITH NOINIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT

  • 常用的SQL语句

    2009-04-22 15:54:03

    以下是一些TSQL语句的介绍:
      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() --函数返回被特定字符括起来的字符串
      /*
      例如:quotename('aaa','{')返回的结果就是 {aaa};
      如果用户没有自定义字符,则sqlserver默认的字符是'[',例如quotename('aaa'),返回的结果就是[aaa]。
      */
      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(
      , <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 的值
      sql中的保留字
      action add aggregate all
      alter after and as
      asc avg avg_row_length auto_increment
      between bigint bit binary
      blob bool both by
      cascade case char character
      change check checksum column
      columns comment constraint create
      cross current_date current_time current_timestamp
      data database databases date
      datetime day day_hour day_minute
      day_second dayofmonth dayofweek dayofyear
      dec decimal default delayed
      delay_key_write delete desc describe
      distinct distinctrow double drop
      end else escape escaped
      enclosed enum explain exists
      fields file first float
      float4 float8 flush foreign
      from for full function
      global grant grants group
      having heap high_priority hour
      hour_minute hour_second hosts identified
      ignore in index infile
      inner insert insert_id int
      integer interval int1 int2
      int3 int4 int8 into
      if is isam join
      key keys kill last_insert_id
      leading left length like
      lines limit load local
      lock logs long longblob
      longtext low_priority max max_rows
      match mediumblob mediumtext mediumint
      middleint min_rows minute minute_second
      modify month monthname myisam
      natural numeric no not
      null on optimize option
      optionally or order outer
      outfile pack_keys partial password
      precision primary procedure process
      processlist privileges read real
      references reload regexp rename
      replace restrict returns revoke
      rlike row rows second
      select set show shutdown
      smallint soname sql_big_tables sql_big_selects
      sql_low_priority_updates sql_log_off sql_log_update sql_select_limit
      sql_small_result sql_big_result sql_warnings straight_join
      starting status string table
      tables temporary terminated text
      then time timestamp tinyblob
      tinytext tinyint trailing to
      type use using unique
      unlock unsigned update usage
      values varchar variables varying
      varbinary with write when
      where year year_month zerofill 
  • 一个存储过程中学到的知识

    2009-04-22 15:49:12

    设计一个存储过程,学到关于数据库的一些知识

    IF Exists(Select * From sysobjects Where Name='SP_SumAgileAtt' And xType='P')
      Drop Proc SP_SumAgileAtt
    go

    Create Proc SP_SumAgileAtt (@Month Varchar(7),@DepIds Varchar(500)='',@EmpNo Varchar(30)='',@UserID Int)
      WITH ENCRYPTION
    /*

    */
    As
    Begin
    --SET NOCOUNT ON
    Declare @EmpId Int,@i Int,@SelStr Varchar(8000),@BDay Varchar(5),@EDay Varchar(5),@SignOffSet Varchar(5),@BDate Varchar(10),@EDate Varchar(10),@aDate DateTime,@ResName Varchar(60),@FromStr Varchar(8000),@WhereStr Varchar(8000),@AndStr Varchar(200),@ExtStr Varchar(8000)


    Create Table #EmpList(EmpID Int)
    IF @UserID=1
      Insert #EmpList Select Employee_ID From Employee
    ELSE
      Insert #EmpList Select a.Employee_ID From Employee As a,Position As b,Department As c,Users_Permission As d
        Where a.Position_ID=b.Position_ID And b.Department_ID=c.Department_ID And d.Department_Id=c.Department_ID And d.User_ID=@UserID
    Create Table #Attendance  
    (iID Int Identity(1,1),
     EmpId Int, 
     dDate datetime,
     Hours Decimal(7,2)
    )
    Select @SignOffSet=CHARINDEX(',',Option_Value) From Setoption Where Option_ename='calctimezone'
    Select @BDay=Substring(Option_Value,1,@SignOffSet-1),@EDay=Substring(Option_Value,@SignOffSet+1,Len(Option_Value)-@SignOffSet) From Setoption Where Option_ename='calctimezone'
    IF @BDay>@EDay
      Set @BDate=Convert(Varchar(10),Dateadd(mm,-1,cast(@Month+'-'+@BDay as datetime)),121)
    ELSE
      Set @BDate=@Month+'-'+Replicate('0',2-Len(@BDay))+@BDay
    IF @EDay<>'31'
      Set @EDate=@Month+'-'+@EDay
    ELSE
      Set @EDate=Convert(Varchar(10),DateAdd(d,-1,DateAdd(m,1,@Month+'-01')),121)
     

    --Select @BDay,@EDay,@BDate,@EDate
    Delete a From #EmpList As a,Demission As b Where a.EmpId=b.Employee_Id And b.Date_Demission<@BDate And Employee_Status='L'
    Insert #Attendance(EmpID,dDate,Hours) Select a.Employee_ID,a.dDate,a.Hours
      From Attendance_Agile_Result As a,#EmpList as b Where a.dDate>=@BDate And a.dDate<=@EDate And a.Employee_ID=b.EmpID
    --- 部门 工号 姓名 上班时数
    --  iID,Employee_ID,dDate,Hours,Attendance_Agile_Result
    Set @SelStr='select r.EmpID,a.employee_no as [工号],a.name as [姓名],b.department_code as [部门代码],b.name as [部门名称],r.上班时数 as [上班时数]'
    Set @FromStr='from employee as a,department as b,position as c'
    Set @WhereStr='where a.position_id=c.position_id and b.department_id=c.department_id'

    Set @SelStr=@SelStr
    Set @FromStr=@FromStr+',(Select EmpID,Sum(Hours) As [上班时数] From #Attendance  Group By EmpID) As r'
    Set @WhereStr=@WhereStr+' And a.Employee_Id*=r'+'.EmpID'

     

    -- Print @SelStr
    -- Print @FromStr
    -- Print @WhereStr


    Set @ExtStr=''
    IF @DepIds<>''
      Set @ExtStr=' And b.department_id in('+@DepIds+')'
    IF @EmpNo<>''
      Set @ExtStr=@ExtStr+' And (a.name like '''+@EmpNo+'%'' or a.employee_no='''+@EmpNo+''')'


    Exec(@SelStr+' '+@FromStr+' '+@WhereStr+@ExtStr+' Order By b.Department_Code,a.Employee_No ')


    Drop Table #EmpList
    Drop Table #Attendance
    End  --EndProc
    go


    --SP_SumAgileAtt '2009-03','','',1
    --go

    CHARINDEX
      返回字符串中指定表达式的起始位置。


    例一:
      CustomName包含客户的First Name和Last Name,它们之间被一个空格隔开。我们用CHARINDX函数确定两个名字中间空格的位置。通过这个方法,我们可以分析ContactName列的空格位置,这样可以只显示这个列的last name部分。
      select top 5 substring(ContactName,charindex(' ',ContactName)+1,len(ContactName)) as [Last Name] from customers
      CHARINDEX函数找到First Name和Last Name之间的空格,所以SUBSTRING函数可以分开ContactName列,这样就只有Last Name被选出。在CHARINDEX函数返回的整数上加1,这样Last Name不是从空格开始。
      例二:
      计算Northwind.dbo.Customer表中Addresses字段中包含单词Road或者它的缩写Rd的记录数,选择语句类似这样:
      Select count(*) from Northwind.dbo.Customers
      Where CHARINDEX('Rd',Address) > 0 or CHARINDEX('Road',Address)> 0

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

    DateAdd函数 返回
      返回包含一个日期的 Variant (Date),这一日期还加上了一段时间间隔。
      语法
      DateAdd(interval, number, date)
      DateAdd 函数语法中有下列命名参数:
      部分 描述
      interval 必要。字符串表达式,是所要加上去的时间间隔。
      number 必要。数值表达式,是要加上的时间间隔的数目。其数值可以为正数(得到未来的日期),也可以为负数(得到过去的日期)。
      date 必要。Variant (Date) 或表示日期的文字,这一日期还加上了时间间隔。
      设置
      interval 参数具有以下设定值:
      设置 描述
      yyyy 年
      q 季
      m 月
      y 一年的日数
      d 日
      w 一周的日数
      ww 周
      hh 时
      n 分钟
      s 秒
      说明
      可以使用 DateAdd 函数对日期加上或减去指定的时间间隔。例如,可以用 DateAdd 来计算距今天为三十天的日期;或者计算距现在为 45 分钟的时间。
      为了对 date 加上“日”,可以使用“一年的日数” (“y”),“日” (”d”) 或“一周的日数” (”w”)。
      DateAdd 函数将不返回有效日期。在以下实例中将 1 月31 日加上一个月:
      DateAdd(m, 1, 31-Jan-95)
      上例中,DateAdd 返回 1995 年 2 月 28 日,而不是 1995 年 2 月 31 日。如果 date 是 1996 年 1 月 31 日,则由于 1996 年是闰年,返回值是 1996 年 2 月 29 日。

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

    cast 函数 用法2008年04月17日 星期四 16:23示例
    A. 同时使用 CAST 和 CONVERT
    每个示例都将检索书名(这些图书的截止当前销售额的第一位数字为 3),并将这些图书的 ytd_sales 转换为 char(20)。

    -- Use CAST.
    USE pubs
    GO
    SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
    FROM titles
    WHERE CAST(ytd_sales AS char(20)) LIKE '3%'
    GO

    -- Use CONVERT.
    USE pubs
    GO
    SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
    FROM titles
    WHERE CONVERT(char(20), ytd_sales) LIKE '3%'
    GO

    下面是任一查询的结果集:

    Title ytd_sales
    ------------------------------ -----------
    Cooking with Computers: Surrep 3876
    Computer Phobic AND Non-Phobic 375
    Emotional Security: A New Algo 3336
    Onions, Leeks, and Garlic: Coo 375

    (4 row(s) affected)

    B. 使用带有算术运算符的 CAST
    下面的示例通过将总的截止当前销售额 (ytd_sales) 与每本图书的价格 (price) 相除,进行单独列计算 (Copies)。在四舍五入到最接近的整数后,此结果将转换为 int 数据类型。

    USE pubs
    GO
    SELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS 'Copies'
    FROM titles
    GO

    下面是结果集:

    Copies
    ------
    205
    324
    6262
    205
    102
    7440
    NULL
    383
    205
    NULL
    17
    187
    16
    204
    418
    18
    1263
    273

    (18 row(s) affected)

    C. 使用 CAST 进行串联
    下面的示例使用 CAST 数据类型转换函数来串联非字符、非二进制表达式。

    USE pubs
    GO
    SELECT 'The price is ' + CAST(price AS varchar(12))
    FROM titles
    WHERE price > 10.00
    GO

    下面是结果集:

    ------------------
    The price is 19.99
    The price is 11.95
    The price is 19.99
    The price is 19.99
    The price is 22.95
    The price is 20.00
    The price is 21.59
    The price is 10.95
    The price is 19.99
    The price is 20.95
    The price is 11.95
    The price is 14.99

    (12 row(s) affected)

    D. 使用 CAST 获得更多易读文本
    下面的示例在选择列表中使用 CAST 将 title 列转换为 char(50) 列,这样结果将更加易读。

    USE pubs
    GO
    SELECT CAST(title AS char(50)), ytd_sales
    FROM titles
    WHERE type = 'trad_cook'
    GO

    下面是结果集:

    ytd_sales
    -------------------------------------------------- ---------
    Onions, Leeks, and Garlic: Cooking Secrets of the 375
    Fifty Years in Buckingham Palace Kitchens 15096
    Sushi, Anyone? 4095

    (3 row(s) affected)

    E. 使用带有 LIKE 子句的 CAST
    下面的示例将 int 列(ytd_sales 列)转换为 char(20) 列,以便使用 LIKE 子句。

    USE pubs
    GO
    SELECT title, ytd_sales
    FROM titles
    WHERE CAST(ytd_sales AS char(20)) LIKE '15%'
    AND type = 'trad_cook'
    GO

    下面是结果集:

    title ytd_sales
    ------------------------------------------------------------ -----------
    Fifty Years in Buckingham Palace Kitchens 15096

    (1 row(s) affected)

     

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

    REPLICATE() --函数返回一个重复character_expression 指定次数的字符串
      /*select replicate('abc', 3) replicate( 'abc', -2)

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


     

  • 好久没来更新知道了

    2009-02-26 17:34:24

    好久没来这里了,今天来做个记号

    天气可真是热啊,才不到三月份,过年后上班才不到一个月呢!

    闷,今天心情不好,手机也老出问题。

  • MYSQL常见出错代码解析

    2009-02-10 16:02:11

    查MYSQL 进程。

    show  processlist

    130 :文件格式不正确。(还不是很清楚错误的状况)

             145 :文件无法打开。

              1005:MYSQL创建表失败

    1006:MYSQL创建数据库失败

         1007:MYSQL数据库已存在,创建数据库失败

    1008:MYSQL数据库不存在,删除数据库失败

    1009:MYSQL不能删除数据库文件导致删除数据库失败

    1010:MYSQL不能删除数据目录导致删除数据库失败

              1011:MYSQL删除数据库文件失败

    1012:MYSQL不能读取系统表中的记录

      1016:文件无法打开,使用后台修复或者使用 phpmyadmin 进行修复。
                          Quote:
                       开始=>所有程序=>附件=>命令提示符
                           输入 mysql 所在硬盘盘符
                        cd mysql 所在目录
                           cd bin
                          输入 myisamchk -f D:usr/local/mysql/data/bbs/PW_members.MYI
                          ps : D:usr/local/mysql/data/bbs 是你论坛数据库的路径
                         -f 根据具体情况选择,一般也可以选择 -r
                        注意你的 系统C盘或放数据库的硬盘空间是否足够,一般小于 1G 很容易出现错误。
                          或用mysqlcheck命令进行修复。具体的方法:利用命令行进入mysql/bin目录,执行
                          mysqlcheck -o -r phpwind -uroot -p                                                     
                          其中phpwind是你数据库的名称,root是你的数据库用户名,然后会提示你输入密码。然后就会修
                          复你的数据库。

              1017:服务器非法关机,导致该文件损坏。

      1020:MYSQL记录已被其他用户修改

    1021:硬盘剩余空间不足,请加大硬盘可用空间

    1022:MYSQL关键字重复,更改记录失败

    1023:MYSQL关闭时发生错误

    1024:MYSQL读文件错误

    1025:MYSQL更改名字时发生错误

    1026:MYSQL写文件错误

    1030:可能是服务器不稳定。(具体原因不是很清楚)

              1032:MYSQL记录不存在

    1036:MYSQL数据表是只读的,不能对它进行修改

    1037:系统内存不足,请重启数据库或重启服务器

    1038:MYSQL用于排序的内存不足,请增大排序缓冲区

    1040:MYSQL已到达数据库的最大连接数,请加大数据库可用连接数
                        Quote:
                          在my.ini 修改max_connections=100为max_connections=1000或更大,重启mysql

    1041:系统内存不足

    1042:无效的主机名

    1043:无效连接

    1044:MYSQL当前用户没有访问数据库的权限

    1045:MYSQL不能连接数据库,服务器、数据库名、用户名或密码错误
                   Quote:
                          方法:确保论坛data目录下的sql_config.php用户名与密码都正确.如果用户忘记了数据库的密码,
                          可以按如下方式进行密码的修改:
                           如果 MySQL 正在运行,首先停止。
                          启动 MySQL :bin/safe_mysqld –skip-grant-tables &
                           就可以不需要密码就进入 MySQL 了。
                           然后就是
                        >use mysql
                        >update user set password=password(”new_pass”) where user=”root”;
                          >flush privileges;

              1046:没有选择数据库。

      1048:MYSQL字段不能为空

    1049:MYSQL数据库不存在

    1050:MYSQL数据表已存在

    1051:MYSQL数据表不存在

    1054:MYSQL字段不存在,自行建立字段

      1060:字段重复,导致无法插入这个字段。

           1062:字段值重复,入库失败
                          Quote:
                           1.如果出类似主码为”65535″的错误,可以查看相关表的自增字段,将字段值改在就可以
                           2.确保相关数据表中主码重复的字段是否存在,如果存在删除这条记录
                           3.备份数据库,修复相关表(注:这种情况比较常见,如pw_posts表,对表进行修复的时候不要忘记备份).

               1064:MySQL 不支持错误提示中的编码。

      1065:MYSQL无效的SQL语句,SQL语句为空

      1067:MySQL 版本为 5,不支持空的默认值。

      1081:MYSQL不能建立Socket连接

    1114:MYSQL数据表已满,不能容纳任何记录

    1116:MYSQL打开的数据表太多

    1129:MYSQL数据库出现异常,请重启数据库

    1130:MYSQL连接数据库失败,没有连接数据库的权限

    1133:MYSQL数据库用户不存在

      1135:可能是内存不足够,请联系空间商解决。

      1141:MYSQL当前用户无权访问数据库

    1142:MYSQL当前用户无权访问数据表

    1143:MYSQL当前用户无权访问数据表中的字段

    1146:MYSQL数据表不存在或数据表缺失,请恢复备份数据

    1147:MYSQL未定义用户对数据表的访问权限

    1149:MYSQL语句语法错误

    1158:网络错误,出现读错误,请检查网络连接状况

    1159:网络错误,读超时,请检查网络连接状况

    1160:网络错误,出现写错误,请检查网络连接状况

    1161:网络错误,写超时,请检查网络连接状况

    1062:MYSQL字段值重复,入库失败

    1169:MYSQL字段值重复,更新记录失败

    1177:MYSQL打开数据表失败

    1180:MYSQL提交事务失败

    1181:MYSQL回滚事务失败

    1203:MYSQL当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或
                           重启数据库

    1205:MYSQL加锁超时

    1211:MYSQL当前用户没有创建用户的权限

    1216:MYSQL外键约束检查失败,更新子表记录失败

    1217:MYSQL外键约束检查失败,删除或修改主表记录失败

    1226:MYSQL当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器

    1227:MYSQL权限不足,您无权进行此操作

    1235:MySQL版本过低,不具有本功能

            1250:客户端不支持服务器要求的认证协议,请考虑升级客户端。

              1251:Client 不能支持 authentication protocol 的要求
                           Client does not support authentication protocol requested by server; consider upgrading MySQL client
                          Quote:
                          方法1:
                                       mysql> SET PASSWORD FOR
                                             -> ‘ some_user ‘@’ some_host ‘ = OLD_PASSWORD(’ newpwd ‘);
                        结合我们的实际情况,在 MySQL Command Line Client 下运行:
                        set password for root@localhost = old_password(’123456′);

                           方法2:
    mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(’newpwd’)
                -> WHERE Host = ’some_host’ AND User = ’some_user’;
    mysql> FLUSH PRIVILEGES;
                               <上面的部分请按自己实际情况修改。>

            1267:不合法的混合字符集。

            2002:服务器端口不对,请咨询空间商正确的端口。

            2003:MySQL 服务没有启动,请启动该服务。

             2008:MySQL client ran out of memory
                        错误指向了MySQL客户mysql。这个错误的原因很简单,客户没有足够的内存存储全部结果。

             2013:远程连接数据库是有时会有这个问题,MySQL 服务器在执行一条 SQL 语句的时候
                        失去了连接造成的。

            10048:最大连接数等问题
      Quote:
                            建议在my.ini文件中修改最大连接数,
                            把 mysql_connect() 方法都改成了 mysql_pconnect() 方法.
                            要修改mysql_pconnect(),可以在论坛的data目录的sql_config.php中
                           $pconnect = 0; //是否持久连接
                            修改成$pconnect = 1;
                            开启防刷新,严禁刷新太快.

             10055:没有缓存空间可利用
                             Quote:
                            查看下你的C盘空间是否已经满,清除一些没有用的文件.
                            可以在后台的”论坛核心设置”,”核心功能设置”里”进程优化”开启,”GZIP 压缩输出”关闭.
                            查找了一下10055(没有缓存空间可利用)出错的原因,分析了my.ini的配制文件,
                            在my.ini中如下:
                             default-storage-engine=INNODB
                             innodb_additional_mem_pool_size=2M
                              innodb_flush_log_at_trx_commit=1
                              innodb_log_buffer_size=1M
                             innodb_buffer_pool_size=10M
                             innodb_log_file_size=10M
                             innodb_thread_concurrency=8
                            觉得可以把innodb_buffer_pool_size=10M 加大如100M或是1000M
                             以上是对mysql5的

                              如果是mysql4可以在my.ini中增加如下:
                              #innodb_data_file_path = ibdata1:2000M;ibdata2:2000M
                             #innodb_data_home_dir = c:ibdata
                             #innodb_log_group_home_dir = c:iblogs
                             #innodb_log_arch_dir = c:iblogs
                             #set-variable = innodb_mirrored_log_groups=1
                              #set-variable = innodb_log_files_in_group=3
                              #set-variable = innodb_log_file_size=5M
                              #set-variable = innodb_log_buffer_size=8M
                              #innodb_flush_log_at_trx_commit=1
                              #innodb_log_archive=0
                              #set-variable = innodb_buffer_pool_size=16M
                              #set-variable = innodb_additional_mem_pool_size=2M
                              #set-variable = innodb_file_io_threads=4
                              #set-variable = innodb_lock_wait_timeout=50
                              把前面的#去了

             10061:MySQL服务不能正常启动
                             Quote:
                             启动这台机器上的MySQL服务
                             如服务启动失败,一定是你的my.ini文件出了差错, MySQL服务不能正常启动
                             你删除了它后,MySQL就会按其默认配置运行,那就没有问题了

  • MYSQL 数据库遇到的瓶颈(数据表被破坏)

    2009-02-09 14:04:19

       --在我们一个客户反应的情况中,一个很奇怪的现象前台操作的数据不显示,后台数据库中都有数据,很郁闷。把客户的环境移到本地,数据操作都是成功的显示,百思不解。

       今天中午终于查到SQL语句中显示The table is full,显示数据表已满。以下是找到的解决方法,备案作查。

    检查表是否被破坏了。然后修复表OK

    optimize table weight_form;
    optimize table users_role;
    optimize table users_perms;
    optimize table users_permission;
    optimize table users;
    optimize table user_info;
    optimize table tmpemployeedmt;
    optimize table tmp_wewl;
    optimize table tmp_title;
    optimize table tmp_source_080225;
    optimize table tmp_salary_source_080225;
    optimize table tmp_salary_source_080128;
    optimize table tmp_salary_source_071010;
    optimize table tmp_salary_other_dmt;
    optimize table tmp_salary_m;
    optimize table tmp_salary_idl_dmt;
    optimize table tmp_salary_dl_dmt;
    optimize table tmp_salary_dl;
    optimize table tmp_salary_200706;
    optimize table tmp_position;
    optimize table tmp_no;
    optimize table tmp_infoext;
    optimize table tmp_import;
    optimize table tmp_float;
    optimize table tmp_employee_0810;
    optimize table tmp_employee_070828;
    optimize table tmp_employee;
    optimize table tmp_dmt_source_dl;
    optimize table tmp_dmt_source;
    optimize table tmp_dmt_salary;
    optimize table tmp_dmt_float;
    optimize table tmp_dmt_bankaccount;
    optimize table tmp_department080123;
    optimize table tmp_department;
    optimize table tmp_depart_map;
    optimize table tmp_depart;
    optimize table tmp_contract1;
    optimize table tmp_contract;
    optimize table tmp_bankaccount;
    optimize table tmp_attendance_manual_record_071010;
    optimize table tmp_att_sum06;
    optimize table tmp_att_dmt_sum06;
    optimize table tmp_0021;
    optimize table title;
    optimize table temp_user_operate_calculate_salary;
    optimize table temp_salary_float;
    optimize table temp_month_shift_0;
    optimize table temp_attendance_to_salary;
    optimize table temp_attendance_summary;
    optimize table temp_attendance_plan_infact;
    optimize table temp_analysis_4;
    optimize table temp_analysis_1;
    optimize table tax_plan_rank;
    optimize table tax_plan;
    optimize table system_customize_field;
    optimize table sysatt_type;
    optimize table sql_log;
    optimize table shift_time;
    optimize table shift_month;
    optimize table shift_day_overtime;
    optimize table shift_day;
    optimize table setoption;
    optimize table session;
    optimize table seq_weight_form_form_id;
    optimize table seq_users_user_id;
    optimize table seq_title_title_id;
    optimize table seq_tax_plan_tax_plan_id;
    optimize table seq_tax_plan_rank_tax_plan_rank_id;
    optimize table seq_shift_time_shift_time_id;
    optimize table seq_shift_month_shift_month_id;
    optimize table seq_shift_day_shift_day_id;
    optimize table seq_salary_plan_plan_id;
    optimize table seq_salary_addition_addition_id;
    optimize table seq_roles_self_role_id;
    optimize table seq_roles_role_id;
    optimize table seq_reward_punishment_rp_id;
    optimize table seq_report_template_id;
    optimize table seq_recruitment_recruitment_id;
    optimize table seq_preference_pref_id;
    optimize table seq_position_position_id;
    optimize table seq_learning_center_lc_id;
    optimize table seq_kpi_kpi_id;
    optimize table seq_kpi_flow_kpi_flow_id;
    optimize table seq_employee_transfer_transfer_id;
    optimize table seq_employee_sr_sr_id;
    optimize table seq_employee_salary_descendant_history_history_id;
    optimize table seq_employee_reward_punishment_erp_id;
    optimize table seq_employee_history_history_id;
    optimize table seq_employee_employee_id;
    optimize table seq_employee_education_education_id;
    optimize table seq_employee_contract_contract_id;
    optimize table seq_employee_contract_attachment_attachment_id;
    optimize table seq_download_history_history_id;
    optimize table seq_department_department_id;
    optimize table seq_demission_survey_item_demission_survey_item_id;
    optimize table seq_demission_survey_demission_survey_id;
    optimize table seq_demission_demission_id;
    optimize table seq_course_type;
    optimize table seq_course_setting;
    optimize table seq_course_record;
    optimize table seq_course_class;
    optimize table seq_course_attendance;
    optimize table seq_course;
    optimize table seq_category_category_id;
    optimize table seq_candidate_interview_interview_id;
    optimize table seq_candidate_flow_candidate_flow_id;
    optimize table seq_candidate_candidate_id;
    optimize table seq_bulletin_bulletin_id;
    optimize table seq_bank_id;
    optimize table seq_attendance_rule_attendance_rule_id;
    optimize table seq_attendance_manual_record_manual_record_id;
    optimize table seq_attendance_manual_record_flow_amrf_id;
    optimize table seq_attendance_machine_format_machine_format_id;
    optimize table self_service_session;
    optimize table self_roles;
    optimize table self_permission;
    optimize table self_module_perm4role;
    optimize table self_module;
    optimize table self_memo;
    optimize table self_mail;
    optimize table salary_track;
    optimize table salary_system_field;
    optimize table salary_status;
    optimize table salary_source;
    optimize table salary_plan;
    optimize table salary_import_data;
    optimize table salary_field_200707;
    optimize table salary_field_200706;
    optimize table salary_field_200705;
    optimize table salary_field;
    optimize table salary_detail;
    optimize table salary_addition_detail;
    optimize table salary_addition;
    optimize table salary_200812;
    optimize table salary_200811;
    optimize table salary_200810;
    optimize table salary_200809;
    optimize table salary_200808;
    optimize table salary_200807;
    optimize table salary_200806;
    optimize table salary_200805;
    optimize table salary_200804;
    optimize table salary_200803;
    optimize table salary_200802;
    optimize table salary_200801;
    optimize table salary_200712;
    optimize table salary_200711;
    optimize table salary_200710;
    optimize table salary_200709;
    optimize table salary_200708;
    optimize table salary_200706;
    optimize table salary_200705;
    optimize table roles;
    optimize table reward_punishment;
    optimize table reportsys;
    optimize table reportpms;
    optimize table reportdptlist;
    optimize table reportcondition;
    optimize table report_type;
    optimize table report_template;
    optimize table report_label;
    optimize table recruitment;
    optimize table recorrectpos;
    optimize table preference;
    optimize table position;
    optimize table pbcatvld;
    optimize table pbcattbl;
    optimize table pbcatfmt;
    optimize table pbcatedt;
    optimize table pbcatcol;
    optimize table module_perm4role;
    optimize table module;
    optimize table learning_center;
    optimize table kpi_flow;
    optimize table kpi;
    optimize table flow_type;
    optimize table flow_run_prcs;
    optimize table flow_run_feedback;
    optimize table flow_run_data;
    optimize table flow_run;
    optimize table flow_process;
    optimize table flow_form_type;
    optimize table employee_transfer;
    optimize table employee_sr;
    optimize table employee_shift_month;
    optimize table employee_salary_descendant_history;
    optimize table employee_role;
    optimize table employee_reward_punishment;
    optimize table employee_history;
    optimize table employee_education;
    optimize table employee_customize;
    optimize table employee_contract_attachment;
    optimize table employee_contract;
    optimize table employee_attendance_card;
    optimize table employee;
    optimize table ehrlog;
    optimize table download_history;
    optimize table dmt_wewl;
    optimize table department_bak_0913;
    optimize table department;
    optimize table demission_type;
    optimize table demission_survey_item;
    optimize table demission_survey;
    optimize table demission;
    optimize table course_type;
    optimize table course_setting_type;
    optimize table course_setting;
    optimize table course_record;
    optimize table course_class;
    optimize table course_attendance;
    optimize table course;
    optimize table category;
    optimize table candidate_interview;
    optimize table candidate_flow;
    optimize table candidate_customize;
    optimize table candidate;
    optimize table bulletin_embracer;
    optimize table bulletin;
    optimize table bankfield;
    optimize table bank;
    optimize table attendance_system_field;
    optimize table attendance_summary_200812;
    optimize table attendance_summary_200811;
    optimize table attendance_summary_200810;
    optimize table attendance_summary_200809;
    optimize table attendance_summary_200808;
    optimize table attendance_summary_200807;
    optimize table attendance_summary_200806;
    optimize table attendance_summary_200805;
    optimize table attendance_summary_200804;
    optimize table attendance_summary_200803;
    optimize table attendance_summary_200802;
    optimize table attendance_summary_200801;
    optimize table attendance_summary_200712;
    optimize table attendance_summary_200711;
    optimize table attendance_summary_200710;
    optimize table attendance_summary_200709;
    optimize table attendance_summary_200708;
    optimize table attendance_summary_200707;
    optimize table attendance_summary_200706;
    optimize table attendance_summary_200705;
    optimize table attendance_summary_200702;
    optimize table attendance_summary_200701;
    optimize table attendance_status;
    optimize table attendance_salary_field;
    optimize table attendance_rule;
    optimize table attendance_manual_record_flow;
    optimize table attendance_manual_record;
    optimize table attendance_machine_result_200912;
    optimize table attendance_machine_result_200911;
    optimize table attendance_machine_result_200910;
    optimize table attendance_machine_result_200909;
    optimize table attendance_machine_result_200908;
    optimize table attendance_machine_result_200907;
    optimize table attendance_machine_result_200906;
    optimize table attendance_machine_result_200905;
    optimize table attendance_machine_result_200904;
    optimize table attendance_machine_result_200903;
    optimize table attendance_machine_result_200902;
    optimize table attendance_machine_result_200901;
    optimize table attendance_machine_result_200812;
    optimize table attendance_machine_result_200811;
    optimize table attendance_machine_result_200810;
    optimize table attendance_machine_result_200809;
    optimize table attendance_machine_result_200808;
    optimize table attendance_machine_result_200807;
    optimize table attendance_machine_result_200806;
    optimize table attendance_machine_result_200805;
    optimize table attendance_machine_result_200804;
    optimize table attendance_machine_result_200803;
    optimize table attendance_machine_result_200802;
    optimize table attendance_machine_result_200801;
    optimize table attendance_machine_result_200712;
    optimize table attendance_machine_result_200711;
    optimize table attendance_machine_result_200710;
    optimize table attendance_machine_result_200709;
    optimize table attendance_machine_result_200708;
    optimize table attendance_machine_result_200707;
    optimize table attendance_machine_result_200706;
    optimize table attendance_machine_result_200705;
    optimize table attendance_machine_result_200704;
    optimize table attendance_machine_result_200703;
    optimize table attendance_machine_result_200702;
    optimize table attendance_machine_result_200701;
    optimize table attendance_machine_raw_data;
    optimize table attendance_machine_format;
    optimize table attendance_machine_data_log;
    optimize table attendance_machine_data_2;
    optimize table attendance_machine_data;
    optimize table attendance_logical;
    optimize table attendance_log;
    optimize table attendance_employee_month_day_time_shift_200912;
    optimize table attendance_employee_month_day_time_shift_200911;
    optimize table attendance_employee_month_day_time_shift_200910;
    optimize table attendance_employee_month_day_time_shift_200909;
    optimize table attendance_employee_month_day_time_shift_200908;
    optimize table attendance_employee_month_day_time_shift_200907;
    optimize table attendance_employee_month_day_time_shift_200906;
    optimize table attendance_employee_month_day_time_shift_200905;
    optimize table attendance_employee_month_day_time_shift_200904;
    optimize table attendance_employee_month_day_time_shift_200903;
    optimize table attendance_employee_month_day_time_shift_200902;
    optimize table attendance_employee_month_day_time_shift_200901;
    optimize table attendance_employee_month_day_time_shift_200812;
    optimize table attendance_employee_month_day_time_shift_200811;
    optimize table attendance_employee_month_day_time_shift_200810;
    optimize table attendance_employee_month_day_time_shift_200809;
    optimize table attendance_employee_month_day_time_shift_200808;
    optimize table attendance_employee_month_day_time_shift_200807;
    optimize table attendance_employee_month_day_time_shift_200806;
    optimize table attendance_employee_month_day_time_shift_200805;
    optimize table attendance_employee_month_day_time_shift_200804;
    optimize table attendance_employee_month_day_time_shift_200803;
    optimize table attendance_employee_month_day_time_shift_200802;
    optimize table attendance_employee_month_day_time_shift_200801;
    optimize table attendance_employee_month_day_time_shift_200712;
    optimize table attendance_employee_month_day_time_shift_200711;
    optimize table attendance_employee_month_day_time_shift_200710;
    optimize table attendance_employee_month_day_time_shift_200709;
    optimize table attendance_employee_month_day_time_shift_200708;
    optimize table attendance_employee_month_day_time_shift_200707;
    optimize table attendance_employee_month_day_time_shift_200706;
    optimize table attendance_employee_month_day_time_shift_200705;
    optimize table attendance_employee_month_day_time_shift_200704;
    optimize table attendance_employee_month_day_time_shift_200703;
    optimize table attendance_employee_month_day_time_shift_200702;
    optimize table attendance_employee_month_day_time_shift_200701;
    optimize table attendance_detail_log_200812;
    optimize table attendance_detail_log_200811;
    optimize table attendance_detail_log_200810;
    optimize table attendance_detail_log_200809;
    optimize table attendance_detail_log_200808;
    optimize table attendance_detail_log_200807;
    optimize table attendance_detail_log_200806;
    optimize table attendance_detail_log_200805;
    optimize table attendance_detail_log_200804;
    optimize table attendance_detail_log_200803;
    optimize table attendance_detail_log_200802;
    optimize table attendance_detail_log_200801;
    optimize table attendance_detail_log_200712;
    optimize table attendance_detail_log_200711;
    optimize table attendance_detail_log_200710;
    optimize table attendance_detail_log_200709;
    optimize table attendance_detail_log_200708;
    optimize table attendance_detail_log_200707;
    optimize table attendance_detail_log_200706;
    optimize table attendance_detail_log_200705;
    optimize table attendance_detail_log_200702;
    optimize table attendance_detail_log_200701;
    optimize table attend_daily_log;
    optimize table attend_daily_data;
    optimize table approval_position_flow;
    optimize table approval_flow;
    optimize table approval_employee_flow;

    check table attendance_employee_month_day_time_shift_200901;

     

  • 2009工作的第一天

    2009-02-02 10:48:10

    上班的第一天,有点懒散的感觉,没有多少新年的喜悦,平平淡淡的,做好自己的事,提升能力,让自己能有竞争力一些。

    回家几天,感觉家里真的很安逸,想法也有了变化,上班是一时的,最终还是要找到一种自由的生存方式才好,上班太不自由了,自己找到赚钱的门路就好了,这样自己和家人都可以过得好一些,不用这么辛苦了。

    时间自由,财富自由,心灵的自由,几时我才能有?

    未来还有许多路要走,却不敢想很多。。。

  • 自动化测试框架指南(转载)

    2009-02-02 10:41:07

    这是我以前写的一篇文章,用于整理自己对自动化测试的理解。当时写这个文章的目的,是因为刚刚掌握QTP,又使用自动化测试参与公司一个大项目的测试,结果发现原来掌握QTP距离自动化测试还有很遥远的路要走,原来一直以为掌握了QTP的脚本编写、可以写出所有的测试方法脚本则自动化测试就可以大功告成了。但是现实是残酷的,实际和自己所想的相差太远了——实际的情况是需求变化快,甚至有段时间开发还没有需求变化快,自动化测试脚本的维护工作量就可想而知了。

    因此我当时就咨询了一下其他的测试同行,他们都认为测试代码复用是很重要的问题,要搭建一个好的测试框架,这就是我当时写这篇文章的目的。

    但是在写了这篇文章后,因为工作原因没有用实践去验证文章里的思想,直到今天才有时间来温习以前的教训。今天来按实际来做时,发现了一个问题——用什么方式来划分test level service function 的颗粒呢?
    打个比方来说,我要写一个测试函数,实现以下功能:我要测试的是登录一个系统,打开一个页面,然后新建一条记录。
    因为还有其他的测试函数,肯定与这个函数有相同的代码部分,比如登录就是显而易见,但是还有一些代码肯定也是重复,而且是隐藏的,那么用什么方法把它们挖掘出来,细分的原则是什么?我实在想不清楚,需要大家的指点


    文章里的一些内容取自别人的帖子或与同行的交流,所以只能算是半原创

    自动化测试框架指南

    以下只是测试框架的一点设想,需要以后修改;
    这套方案的最终结果是实现测试自动化,但是因为目前人力、实力有限,只能逐步完善设想中的功能;最终的目的是要实现define the driver——定义驱动测试。
    本文的自动化测试以MI公司的QuickTest professional 为例
    1定义:
            Services function :业务函数
            TestCase(测试用例):是能够从头至尾独立执行的最小测试单元
            测试框架的设想

    1.1Services Function 的分类及分类原则
    Service Function的颗粒大小需求不一,靠自己来掌握,总之应该是尽量少的Service Function满足所有Case Function的需要
            Common level¬——所有项目测试都可以使用的函数,比如验证小数精度、写测试结果到报告等等。
    Common level是公用的函数库,不需要经常修改,因此可以编成DLL文件,供所有的测试脚本使用。
    使用语法可以这样:
    ‘------------------------------------
    Set ōbject=createobject(“”)
    Call object.funciton “”
    ‘------------------------------------

            High level¬——各项目专用的测试用例,是为专门的测试项目而设置的,但是这些Services Function不能单独作测试,必须配合更高一级的Test level才能使用
            Test level¬¬——Test level可以这样理解:是对某一个用户来说,为了完成某项工作和业务,时间从头至尾相对连续的一组操作。
            Test level并不是测试用例,但是它的颗粒大小却决定了其复用程度,因此需要仔细分析每个TestCase的业务逻辑,将相同的Test Level services function 总结出来。
            Test level的组成:
    Function
    Step          ‘测试所要进行的操作
    Validation     ‘验证测试的结果
    Return result   ‘返回测试的结果,validation的验证结果也应该通过这一部分的函数写入到result report中
    End function

    1.2 Test case 和Test suite
            Test Case:测试用例。可以这样理解:是一组人为了完成某项工作和业务,时间从头至尾相对连续的一组操作
            Test suite: 是一个相同工作性质的工作部门人员,为了完成某项工作和业务,时间从头至尾相对连续的一组操作。
            Test case和Test suite的意义:
    1、大量的Case,肯定是分模块存放的。否则就难以查询和维护、修改。
    2、Test Case和Test level \high level service function的互相调用关系可以通过insight sources这个工具来查询。
    3、Suite相当于一个Case模块,里面包含很多个Case;比如测试用户管理的,都放在一个Suite里,测试设备管理的,放在另一个suite里。
    1.3TestCase的分类原则
            一般复杂Case,要牵扯到好多个模块的功能的,但是要看它的主要测试点是什么,然后按这个测试点所属模块,来确定这个Case归属哪个模块的。
            有依赖关系的Case,是合并成一个Case,还是保留独立?运行起来有依赖关系,倾向于合并成一个Case,合并的好处是运行方便,但是出错时要再区分是那个小Case的错误;分开的话,就相反,运行不方便,但出错时比较明确哪个错了。
            如果A是建10万个用户,要花1小时的时间,那你还会放在一块嘛,肯定是倾向分开成小Case,不然B出错了,你还得再重头跑ABCD,测试人员会气死的!所以运行麻烦、容易出错、时间较长的小case,还是保持独立,只要跟测试人员写好说明文档,让他们知道正确的运行方法,就可以了
            如果合成一个case,我应该把它放到哪个suite里呢 因为它横跨了几个页面,都是测试点,不好划分啊。放在那个Suite里啊,那都可以啊,或者你想独立一个suite也可以啊,无所谓的,只要你运行结果有正确记录,不会漏掉丢失就可以了。
            测试环境可以通过重新导入数据来恢复,这样就可以将一部分运行时间长、但是又有依赖关系的Test case分离出来,避免总是要从开头进行测试。
            一个Test suite里的用到的lib和OR都是相同的。




    1.4测试用例和Services Function命名规则
    类型        名称
    Test case        项目名_TC_name
    test level services function        项目名_TL_name
    high level services function        项目名_HL_name
    common level services function        CL_name(不应包括项目名,因为此类函数是公用的)
    2工作方式
    并非所有的测试用例都可以用自动化来完成,因此需要对用例进行挑选,选择合适的用例作为自动化测试用例。记住!自动化测试的成本是巨大的,一般来说,一个脚本运行6~7次才算收回成本,因此不可寄予自动化测试过高期望。
    2.1选择自动化测试用例
    2.1.1不适合自动化测试用例的情况
            定制型项目(一次性的)。为客户定制的项目,维护期由客户方承担的,甚至采用的开发语言、运行环境也是客户特别要求的,即公司在这方面的测试积累就少,这样的项目不适合作自动化测试。
            项目周期很短的项目。项目周期很短,测试周期很短,就不值得花精力去投资自动化测试,好不容易建立起的测试脚本,不能得到重复的利用是不现实的。
            业务规则复杂的对象。业务规则复杂的对象,有很多的逻辑关系、运算关系,工具就很难测试。
            美观、声音、易用性测试。人的感观方面的:界面的美观、声音的体验、易用性的测试,也只有人来测试。
            测试很少运行。测试很少运行,对自动化测试就是一种浪费。自动化测试就是让它不厌其烦的、反反复复的运行才有效率。
            软件不稳定。软件不稳定,则会由于这些不稳定因素导致自动化测试失败。只有当软件达到相对的稳定,没有界面性严重错误和中断错误才能开始自动化测试。
            涉及物理交互。工具很难完成与物理设备的交互,比如刷卡的测试等。
    2.1.2适合自动化测试的情况
    自动化测试之所以能在很多大公司实施起来,就是有它适合自动化测试的特点和高的投资回报率。
            产品型项目。产品型的项目,每个项目只改进少量的功能,但每个项目必须反反复复的测试那些没有改动过的功能。这部分测试完全可以让自动化测试来承担, 同时可以把新加入的功能的测试也慢慢地加入到自动化测试当中。
            增量式开发、持续集成项目。由于这种开发模式是频繁的发布新版本进行测试,也就需要频繁的自动化测试,以便把人从中解脱出来测试新的功能。
            能够自动编译、自动发布的系统。要能够完全实现自动化测试,必须具有能够自动化编译,自动化发布系统进行测试的功能。 当然,不能达到这个要求也可以在手工干预的情况下进行自动化测试。
            回归测试。回归测试是自动化测试的强项,它能够很好的验证你是否引入了新的缺陷,老的缺陷是否修改过来了。在某种程度上可以把自动化测试工具叫做回归测试工具。
            多次重复、机械性动作,将烦琐的任务转化为自动化测试。自动化测试最适用于多次重复、机械性动作,这样的测试对它来说从不会失败。比如要向系统输入大量的相似数据来测试压力和报表。
            需要频繁运行测试。在一个项目中需要频繁的运行测试,测试周期按天算,就能最大限度的利用测试脚本,提高工作效率。
    2.2编写Test case和Test level
    分析Test Case的业务,将Test Level services function 的颗粒从Test Case中识别出来,尽量做到用少的Service function来实现测试业务。
    2.3搭建测试框架
    依据测试框架,在下一节中提到。依次填入测试框架的内容。
    2.4执行测试并记录bug
    这时就可以开始执行测试。测试结果应该自动被记录在测试报告中,而不应该一遇到BUG就停止——除非必须停止。这里注意以下几点
            测试报告功能应该在Common level中实现,这样所有的测试都可以共用。
            测试框架应该具有一定的判断功能,一旦某个测试失败。测试框架可以决定停止测试,或者转入不受影响的新测试用例,Test suite分类也应该注意这一点,因为同一个Test suite一般来说是互相影响的。
            测试框架可以具有某种还原测试环境的功能——即测试结束清理的功能,这样就可以自动恢复到不受影响的测试环境中。
    2.5维护测试脚本
    这是一项工作量很大的工作。维护脚本的难度很大程度上与团队活动有关,相关信息参考第4节。
    3测试框架的构想
    3.1Test Driver
    测试框架的核心叫Test driver,它具有以下一些东西
            全局参数。
            所要测试的用例集,也许叫Test suite集更合适;包括测试所要用到的参数。
            对于用例的描述。
            lib and tsr。
            能够判断测试结果,并且决定是否调用其它的测试用例,或者停止测试。
            自动生成测试报告。以及需要输出的路径。
            每个测试脚本的初始设置路径
    4团队开展自动化测试要点
    单人自动化测试与团队开展自动化测试有很大不同,因为不同的对象名、不同的函数会造成每个人的测试脚本不同,并难以合并成一个完整、统一的脚本。为了解决这个问题,应该注意以下几点:
            团队成员在编写脚本时应该多使用对象库,尽量少使用描述性编程。
            统一对象名称,规定网页元素对象命名的统一规定,这样才可能在合并对象库时统一。
            统一函数命名规定。
            统一函数书写格式。
            统一对同一类型操作的处理方式——应该定期举行会议,沟通各种操作的处理方法,共同提高对系统的认识水平。
    5测试配置
    测试配置应该尽量自动完成,减少工作量。
    测试配置包括如下内容:
            测试工具的配置
            测试环境,如数据、数据库结构
    6测试初始设置
    一些测试用例相互依赖,本应该把它们合成一个测试用例;但是如果单个测试用例颗粒很大,那么在回归测试或再现缺陷时就会使人发疯,并且浪费了大量的测试时间。最好最可靠的解决办法看来只有一种,那就是将颗粒大的测试用例分离出来,同时为这个测试用例预备测试初始设置——将客户端所需要的数据库结构和数据库备份,并且作为测试初始设置保存管理。
    这里的测试初始设置并非只针对自动化测试,手工测试也被包括进来。
    6.1测试初始设置的命名办法
    TE+测试用例编号
    如测试用例为TC1.2,则TE为TE1.2
    6.2测试初始设置的保存
    测试初始设置应保存在单独的文件夹内,初始设置的路径被链接到Test driver上。
  • SQL 语句提高篇(一)

    2009-01-23 14:58:46

    --查询出各(某)表字段的属性
    [code=SQL]
    --sql server 2000
    SELECT
        表名       = case when a.colorder=1 then d.name else '' end,
        表说明     = case when a.colorder=1 then isnull(f.value,'') else '' end,
        字段序号   = a.colorder,
        字段名     = a.name,
        标识       = case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
        主键       = case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (
                         SELECT name FROM sysindexes WHERE indid in(
                            SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then '√' else '' end,
        类型       = b.name,
        占用字节数 = a.length,
        长度       = COLUMNPROPERTY(a.id,a.name,'PRECISION'),
        小数位数   = isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
        允许空     = case when a.isnullable=1 then '√'else '' end,
        默认值     = isnull(e.text,''),
        字段说明   = isnull(g.[value],'')
    FROM
        syscolumns a
    left join
        systypes b
    on
        a.xusertype=b.xusertype
    inner join
        sysobjects d
    on
        a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties'
    left join
        syscomments e
    on
        a.cdefault=e.id
    left join
        sysproperties g
    on
        a.id=g.id and a.colid=g.smallid 
    left join
        sysproperties f
    on
        d.id=f.id and f.smallid=0
    where
        d.name='要查询的表'    --如果只查询指定表,加上此条件
    order by
        a.id,a.colorder

    /*
    表名    表说明 字段序号 字段名    标识 主键    类型    占用字节数 长度 小数位数 允许空  默认值      字段说明
    ------- ----- -------  -------- ---- ------- ------ ------- --------------- ------ ---------- ----------
    authors       1        au_id          √     id      11     11      0                         
                  2        au_lname              varchar 40     40      0                         
                  3        au_fname              varchar 20     20      0                         
                  4        phone                 char    12     12      0              ('UNKNOWN')
                  5        address               varchar 40     40      0       √                
                  6        city                  varchar 20     20      0       √                
                  7        state                 char    2      2       0       √                
                  8        zip                   char    5      5       0       √                
                  9        contract              bit     1      1       0                         
    (所影响的行数为 9 行)
    */

     
    --修改一个字段里的内容

    06财经报/NJ-Q-W-6.2.2-001周前集会管理办法
    06财经报/NJ-Q-W-4.2.3-004文印管理制度
    06财经报/NJ-Q-W-5.5.1-001组织权责管理办法

    通过什么语句达到:这样效果
    06财经/NJ-Q-W-6.2.2-001周前集会管理办法
    06财经/NJ-Q-W-4.2.3-004文印管理制度
    06财经/NJ-Q-W-5.5.1-001组织权责管理办法
    update tb set lj=replace(lj,'财经报','财经')


    --同一表中二列值互换
    update xxx set A=B,B=A

    --对2个列同时分组的查询 
    rq(日期)    bh(编号)  sl(数量)  dj(单价)
    2008/10/17  102030      2          40
    2008/10/17  102231      4          5
    2009/04/12  102030      6          20
    2009/05/05  201020      10          8
     求每年中每种产品销售情况???
    ( 编号的前2位数代表 产品 类型)
    select
      left(rq,4) as 年份,
      bh 产品编号,
      sum(sl) 销售数量,
      sum(sl*dj) as 销售额
    from 表
    group by bh

    select c.cost_center,c.name,b.jibengongzi  from employee as a ,salary_200808 as b,
    department as c ,position as d
    where
    a.cost_center_xref_department_id=c.department_id and a.employee_id=b.employee_id
     and a.position_id=d.position_id
    and  d.department_id=c.department_id
    select * from employee
    update employee set cost_center_xref_department_id=4 where employee_id=16

    select * from department

    --
    表table有3个字段id, type, num分别代表每笔货物的标识,类型,数量;请写出sql语句,
    可以得到各种type货物中num值最高的数据;

    if not object_id('tb') is null
        drop table tb
    Go
    Create table tb([bh] nvarchar(3),[name] nvarchar(2),[num] int)
    Insert tb
    select N'001',N'依利',1000 union all
    select N'002',N'三鹿',5000 union all
    select N'003',N'依利',7000 union all
    select N'004',N'蒙牛',1000 union all
    select N'005',N'三鹿',2000 union all
    select N'006',N'依利',6000 union all
    select N'007',N'蒙牛',2000 union all
    select N'008',N'依利',8000
    Go
    Select * from tb

    select bh,name,num
    from tb t
    where not exists(select 1 from tb where name=t.name and num>t.num)

    select *
    from @tb a
    where num=(select max(num) from @tb where name=a.name)
    /**

    select * from tb a
    where num = (select top 1 num
    from tb
    where type=a.type
    order by num desc)

    select type,max(num) from tb group by type

    select type as type,max(num) as maximum from testTable1 group by type


    --多维数据库分析

    http://topic.csdn.net/u/20081127/15/d916bf00-fd27-4d39-9d7b-0d0437efad0c.html
    现有5个表,最前面的一列都是自动编号)
    一.分类表
      分类ID,  分类名称
      1        一类
      2        二类
      .............
    二.物资表
      物资ID,  物资名称,  物资单价,  分类ID
      1        固化剂      20        2
      2        塑料桶      10        1
      3        加热板      35        2
      ............
    三.部门表
      部门ID,  部门名称
      1          A部门
      2          B部门
      ........
    四.领用表
      领用ID,  领用日期,  物资ID, 领用数量 领用部门ID
      1      2008-10-20    2        20        1
      2      2008-11-2    1        30        3
      3      2008-11-25    2        40        2
      ........
    五.计划表
      计划ID,  部门ID,  月计划金额,  计划月份
      1          1        2000      2008-10-1
      2          2        1000      2008-10-1
      3          3        3000      2008-10-1
      .......
      7          1        2100      2008-11-1
      8          2        1100      2008-11-1
      9          3        3100      2008-11-1
      ......

    计划表中,每月会输入当月计划金额,以便和实际领用金额比较,计算出差值,做成本控制.请SQL高手帮忙写一下,非常感谢

    要求结果1: 某年某月领用额和差额
    '------------------------------------------------------------
                    xxxx年x月物资领用量
                A部门      B部门  ....
    一类          x¥        x¥
    二类          x¥        x¥
    ....          ...        ...
    合计金额      x¥        x¥
    计划金额      x¥        x¥
    差额          x¥        x¥


    '要求结果2:  指定日期内的领用量
    '-------------------------------------------------
              xxxx年x月x日---xxxx年x月x日物资领用量
                A部门      B部门  ....
    一类          x¥        x¥
    二类          x¥        x¥
    ....          ...        ...
    合计金额      x¥        x¥
    ---------------------------------------------------
    create table 分类表(分类ID int , 分类名称 varchar(10))
    insert into 分类表 values(1 , '一类')
    insert into 分类表 values(2 , '二类')
    insert into 分类表 values(3 , '三类')
    create table 物资表(物资ID int, 物资名称 varchar(10), 物资单价 int, 分类ID int)
    insert into 物资表 values(1 , '固化剂' , 20 , 2 )
    insert into 物资表 values(2 , '塑料桶' , 10 , 1 )
    insert into 物资表 values(3 , '加热板' , 35 , 3 )
    create table 部门表(部门ID int, 部门名称 varchar(10))
    insert into 部门表 values(1 , 'A部门')
    insert into 部门表 values(2 , 'B部门')
    insert into 部门表 values(3 , 'C部门')
    create table 领用表(领用ID int, 领用日期 datetime, 物资ID int, 领用数量 int, 领用部门ID int)
    insert into 领用表 values(1 , '2008-10-20', 2 , 20 , 1)
    insert into 领用表 values(2 , '2008-11-2' , 1 , 30 , 3)
    insert into 领用表 values(3 , '2008-11-25', 3 , 40 , 2)
    insert into 领用表 values(4 , '2008-11-26', 2 , 50 , 3)
    insert into 领用表 values(5 , '2008-11-27', 1 , 60 , 1)
    insert into 领用表 values(6 , '2008-11-27', 3 , 60 , 1)
    create table 计划表(计划ID int, 部门ID int, 月计划金额 int, 计划月份 datetime)
    insert into 计划表 values(1 , 1 , 2000 , '2008-10-1')
    insert into 计划表 values(2 , 2 , 1000 , '2008-10-1')
    insert into 计划表 values(3 , 3 , 3000 , '2008-10-1')
    insert into 计划表 values(7 , 1 , 2100 , '2008-11-1')
    insert into 计划表 values(8 , 2 , 1100 , '2008-11-1')
    insert into 计划表 values(9 , 3 , 3100 , '2008-11-1')

    declare @sql varchar(4000)
    set @sql='select b.分类名称'
    select @sql=@sql+',max(case 部门名称 when '''+部门名称+''' then 消耗金额 else 0 end)'+'['+部门名称+']'
    from (select distinct 部门名称 from 部门表) a
    set @sql=@sql+' from (select 分类名称,部门名称,领用数量*物资单价 as 消耗金额
    from 领用表,物资表,分类表,部门表
    where 物资表.物资ID=领用表.物资ID
    and 分类表.分类ID=物资表.分类ID
    and 部门表.部门ID=领用表.领用部门ID) b group by b.分类名称'
    print @sql
    exec(@sql)

    --打印出来的SQL静态语句
    select b.分类名称,
    max(case 部门名称 when 'A部门' then 消耗金额 else 0 end)[A部门],
    max(case 部门名称 when 'B部门' then 消耗金额 else 0 end)[B部门],
    max(case 部门名称 when 'C部门' then 消耗金额 else 0 end)[C部门]
    from (select 分类名称,部门名称,领用数量*物资单价 as 消耗金额
    from 领用表,物资表,分类表,部门表
    where 物资表.物资ID=领用表.物资ID
    and 分类表.分类ID=物资表.分类ID
    and 部门表.部门ID=领用表.领用部门ID) b group by b.分类名称

    --结果如下:
    --分类名称 A部门 B部门 C部门
    --二类     1200  0    600
    --三类     2100  1400 0
    --一类     200   0   


    create table 分类表(分类ID int , 分类名称 varchar(10))
    insert into 分类表 values(1 , '一类')
    insert into 分类表 values(2 , '二类')
    insert into 分类表 values(3 , '三类')
    create table 物资表(物资ID int, 物资名称 varchar(10), 物资单价 int, 分类ID int)
    insert into 物资表 values(1 , '固化剂' , 20 , 2 )
    insert into 物资表 values(2 , '塑料桶' , 10 , 1 )
    insert into 物资表 values(3 , '加热板' , 35 , 3 )
    create table 部门表(部门ID int, 部门名称 varchar(10))
    insert into 部门表 values(1 , 'A部门')
    insert into 部门表 values(2 , 'B部门')
    insert into 部门表 values(3 , 'C部门')
    create table 领用表(领用ID int, 领用日期 datetime, 物资ID int, 领用数量 int, 领用部门ID int)
    insert into 领用表 values(1 , '2008-10-20', 2 , 20 , 1)
    insert into 领用表 values(2 , '2008-11-2' , 1 , 30 , 3)
    insert into 领用表 values(3 , '2008-11-25', 3 , 40 , 2)
    insert into 领用表 values(4 , '2008-11-26', 2 , 50 , 3)
    insert into 领用表 values(5 , '2008-11-27', 1 , 60 , 1)
    insert into 领用表 values(6 , '2008-11-27', 3 , 60 , 1)
    create table 计划表(计划ID int, 部门ID int, 月计划金额 int, 计划月份 datetime)
    insert into 计划表 values(1 , 1 , 2000 , '2008-10-1')
    insert into 计划表 values(2 , 2 , 1000 , '2008-10-1')
    insert into 计划表 values(3 , 3 , 3000 , '2008-10-1')
    insert into 计划表 values(7 , 1 , 2100 , '2008-11-1')
    insert into 计划表 values(8 , 2 , 1100 , '2008-11-1')
    insert into 计划表 values(9 , 3 , 3100 , '2008-11-1')

    declare @sql varchar(4000)
    set @sql='if (object_id(''temptd1'')) is not null
    drop table temptd1 '
    set @sql=@sql+'
    if object_id(''temptd2'') is not null
    drop table temptd2 '
    set @sql=@sql+'
    if object_id(''temptd3'') is not null
    drop table temptd3 '
    set @sql=@sql+'
    if object_id(''temptd4'') is not null
    drop table temptd4 '
    set @sql=@sql+'
    select * into temptd1 from'
    set @sql=@sql+'
    (select b.分类名称'
    select @sql=@sql+',
    max(case 部门名称 when '''+部门名称+''' then 消耗金额 else 0 end)'+'['+部门名称+']'
    from (select distinct 部门名称 from 部门表) a
    set @sql=@sql+'
    from (select 分类名称,部门名称,领用数量*物资单价 as 消耗金额
    from 领用表,物资表,分类表,部门表
    where 物资表.物资ID=领用表.物资ID
    and 分类表.分类ID=物资表.分类ID
    and 部门表.部门ID=领用表.领用部门ID) b group by b.分类名称) 表1 '

    set @sql=@sql+'
    select * into temptd2 from(select ''合计金额'' as 分类名称'
    select @sql=@sql+',
    sum('+部门名称+') ['+部门名称+']'
    from(select distinct 部门名称 from 部门表) a
    set @sql=@sql+' from temptd1) 表2 '

    set @sql=@sql+'
    select * into temptd3 from(select ''计划金额'' as 分类名称'
    select @sql=@sql+',
    sum(case 部门名称 when '''+部门名称+''' then 月计划金额 else 0 end) ['+部门名称+']'
    from(select distinct 部门名称 from 部门表) a
    set @sql=@sql+'
    from 部门表,计划表 where 计划表.部门ID=部门表.部门ID) 表3 '

    set @sql=@sql+'
    select * into temptd4 from(select ''差额'' as 分类名称'
    select @sql=@sql+',
    (temptd3.'+部门名称+'-temptd2.'+部门名称+') ['+部门名称+']'
    from(select distinct 部门名称 from 部门表) a
    set @sql=@sql+' from temptd2,temptd3) 表4'
    set @sql=@sql+'

    select * from temptd1
    union all
    (select * from temptd2)
    union all
    (select * from temptd3)
    union all
    (select * from temptd4)'
    print @sql
    exec(@sql)

    --打印出来的SQL静态语句
    if (object_id('temptd1')) is not null
    drop table temptd1
    if object_id('temptd2') is not null
    drop table temptd2
    if object_id('temptd3') is not null
    drop table temptd3
    if object_id('temptd4') is not null
    drop table temptd4
    select * into temptd1 from
    (select b.分类名称,
    max(case 部门名称 when 'A部门' then 消耗金额 else 0 end)[A部门],
    max(case 部门名称 when 'B部门' then 消耗金额 else 0 end)[B部门],
    max(case 部门名称 when 'C部门' then 消耗金额 else 0 end)[C部门]
    from (select 分类名称,部门名称,领用数量*物资单价 as 消耗金额
    from 领用表,物资表,分类表,部门表
    where 物资表.物资ID=领用表.物资ID
    and 分类表.分类ID=物资表.分类ID
    and 部门表.部门ID=领用表.领用部门ID) b group by b.分类名称) 表1
    select * into temptd2 from(select '合计金额' as 分类名称,
    sum(A部门) [A部门],
    sum(B部门) [B部门],
    sum(C部门) [C部门] from temptd1) 表2
    select * into temptd3 from(select '计划金额' as 分类名称,
    sum(case 部门名称 when 'A部门' then 月计划金额 else 0 end) [A部门],
    sum(case 部门名称 when 'B部门' then 月计划金额 else 0 end) [B部门],
    sum(case 部门名称 when 'C部门' then 月计划金额 else 0 end) [C部门]
    from 部门表,计划表 where 计划表.部门ID=部门表.部门ID) 表3
    select * into temptd4 from(select '差额' as 分类名称,
    (temptd3.A部门-temptd2.A部门) [A部门],
    (temptd3.B部门-temptd2.B部门) [B部门],
    (temptd3.C部门-temptd2.C部门) [C部门] from temptd2,temptd3) 表4

    select * from temptd1
    union all
    (select * from temptd2)
    union all
    (select * from temptd3)
    union all
    (select * from temptd4)

    (所影响的行数为 3 行)


    (所影响的行数为 1 行)


    (所影响的行数为 1 行)


    (所影响的行数为 1 行)


    --结果如下:
    --分类名称 A部门 B部门 C部门
    --二类     1200  0    600
    --三类     2100  1400 0
    --一类     200   0    500
    --合计金额 3500  1400 1100
    --计划金额 4100  2100 6100
    --差额     600   700  5000

    ---------------------------------------------------------------
    /*
    标题:普通行列转换(version 2.0)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

    问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果):
    姓名 语文 数学 物理
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */

    create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go

    --SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    select 姓名 as 姓名 ,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名

    --SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql)

    --SQL SERVER 2005 静态SQL。
    select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

    --SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

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

    /*
    问题:在上述结果的基础上加平均分,总分,得到如下结果:
    姓名 语文 数学 物理 平均分 总分
    ---- ---- ---- ---- ------ ----
    李四 74   84   94   84.00  252
    张三 74   83   93   83.33  250
    */

    --SQL SERVER 2000 静态SQL。
    select 姓名 姓名,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理,
      cast(avg(分数*1.0) as decimal(18,2)) 平均分,
      sum(分数) 总分
    from tb
    group by 姓名

    --SQL SERVER 2000 动态SQL。
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
    exec(@sql)

    --SQL SERVER 2005 静态SQL。
    select m.* , n.平均分 , n.总分 from
    (select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
    (select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
    where m.姓名 = n.姓名

    --SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
    exec ('select m.* , n.平均分 , n.总分 from
    (select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
    (select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
    where m.姓名 = n.姓名')

    drop table tb   

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

    /*
    问题:如果上述两表互相换一下:即表结构和数据为:
    姓名 语文 数学 物理
    张三 74  83  93
    李四 74  84  94
    想变成(得到如下结果):
    姓名 课程 分数
    ---- ---- ----
    李四 语文 74
    李四 数学 84
    李四 物理 94
    张三 语文 74
    张三 数学 83
    张三 物理 93
    --------------
    */

    create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
    insert into tb values('张三',74,83,93)
    insert into tb values('李四',74,84,94)
    go

    --SQL SERVER 2000 静态SQL。
    select * from
    (
     select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
     union all
     select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
     union all
     select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
    ) t
    order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

    --SQL SERVER 2000 动态SQL。
    --调用系统表动态生态。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
    from syscolumns
    where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
    order by colid asc
    exec(@sql + ' order by 姓名 ')

    --SQL SERVER 2005 动态SQL。
    select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

    --SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

    --------------------
    /*
    问题:在上述的结果上加个平均分,总分,得到如下结果:
    姓名 课程   分数
    ---- ------ ------
    李四 语文   74.00
    李四 数学   84.00
    李四 物理   94.00
    李四 平均分 84.00
    李四 总分   252.00
    张三 语文   74.00
    张三 数学   83.00
    张三 物理   93.00
    张三 平均分 83.33
    张三 总分   250.00
    ------------------
    */

    select * from
    (
     select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
     union all
     select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
     union all
     select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
     union all
     select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
     union all
     select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
    ) t
    order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

    drop table tb
    ---------------------------------------------------------------


    有一表t1 保存每次访问网站IP访问数据如
    id  FromIP    AddTime

    我查查询的结果为 每天的独立IP 总数
    --
    select count(distinct FromIP)
    from t1
    where convert(varchar(10),AddTime ,120) ='2008-01-01'--条件
    --
    select convert(varchar(10),addtime,120) [天] , count(1) [多少独立IP] from tb group by convert(varchar(10),addtime,120)
    --
    select convert(varchar(10),AddTime ,120) ev_day,count(distinct FromIP)
    from t1
    group by convert(varchar(10),AddTime ,120)

    ---------------------------------------------------------------
    用SQL语句来备份数据库,如何做?
    substring


    datediff
    select * from table1
    where datediff(day,insertdate,getdate()) = 3

    -------------------------------------------
    表 account(userid,username)
    userid  username
    1        zhangshan
    2        lishi
    3        wangwu
    4        liliu
    4        liqi

    查询结果    :
    1        zhangshan
    2        lishi
    3        wangwu
    4        liliu

    请各位高手帮帮忙     
    --> --> (Andy)生成测试数据 2008-10-19
    Set Nocount On
    declare @accoun table([userid] int,[username] nvarchar(9))
    Insert @accoun
    select 1,N'zhangshan' union all
    select 2,N'lishi' union all
    select 3,N'wangwu' union all
    select 4,N'liliu' union all
    select 4,N'liqi'

    Select * From @accoun a Where username=(Select Top 1 username From @accoun Where userid=a.userid)

    /*
    userid      username
    ----------- ---------
    1           zhangshan
    2           lishi
    3           wangwu
    4           liliu

    */

    -----------------------
    如何用存储过程实现在表的分页浏览,传入参数pageindex和pagesize,
    http://topic.csdn.net/u/20081021/12/f42039c7-fc93-44e4-b96c-92800b997ac0.html
    DECLARE @pagenum AS INT, @pagesize AS INT
    SET @pagenum = 2
    SET @pagesize = 3
    SELECT *
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum,
            newsid, topic, ntime, hits
          FROM news) AS D
    WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
    ORDER BY newsid DESC

    ----------------------------SQL查询列转行(多表查询,并分组)  -----------------------------------------
    http://topic.csdn.net/u/20081027/12/4f803ea0-00d2-4bd6-8853-3b9968d95a81.html
    问题描述:
    无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
      所以,当我们在处理下列要求时,会比较麻烦:
    有表tb, 如下:
    id    value
    ----- ------
    1     aa
    1     bb
    2     aaa
    2     bbb
    2     ccc
    需要得到结果:
    id     values
    ------ -----------
    1      aa,bb
    2      aaa,bbb,ccc
    即, group by id, 求 value 的和(字符串相加)

    1. 旧的解决方法

    -- 1. 创建处理函数
    CREATE FUNCTION dbo.f_str(@id int)
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @r varchar(8000)
        SET @r = ''
        SELECT @r = @r + ',' + value
        FROM tb
        WHERE id=@id
        RETURN STUFF(@r, 1, 1, '')
    END
    GO
    -- 调用函数

    SELECt id, values=dbo.f_str(id)
    FROM tb
    GROUP BY id

    -- 2. 新的解决方法
    -- 示例数据
    DECLARE @t TABLE(id int, value varchar(10))
    INSERT @t SELECT 1, 'aa'
    UNION ALL SELECT 1, 'bb'
    UNION ALL SELECT 2, 'aaa'
    UNION ALL SELECT 2, 'bbb'
    UNION ALL SELECT 2, 'ccc'

    -- 查询处理
    SELECT *
    FROM(
        SELECT DISTINCT
            id
        FROM @t
    )A
    OUTER APPLY(
        SELECT
            [values]= STUFF(REPLACE(REPLACE(
                (
                    SELECT value FROM @t N
                    WHERE id = A.id
                    FOR XML AUTO
                ), '<N value="', ','), '"/>', ''), 1, 1, '')
    )N

    /*--结果
    id          values
    ----------- ----------------
    1           aa,bb
    2           aaa,bbb,ccc
    (2 行受影响)
    --*/

    ------------基础查询统计-------------------------------------------------------------
    表a:
    -----------
    姓名
    -----------
    张三
    李四
    王五
    马六
    林七
    朱八
    --------------
    表B:
    --------------
    姓名  金额  货币
    --------------
    张三    1    1
    李四    2    1
    王五    1    2
    马六    1    3
    张三    1    3
    张三    2    1
    --------------
    通过数据表得到视图C

    -------------------------------------------
    姓名      货币1汇总      货币2汇总    货币3汇总
    -------------------------------------------
    张三        3                        1
    李四        2
    王五                        1
    马六                                      1
    林七
    朱八
    --------------------------------------------
    总计        5            1          2
    --------------------------------------------

    要求说明:
    1、表A中的姓名列不管是否有货币收付发生,均需出现在视图C中
    2、表B中的货币收付记录按照表A的列进行分币种汇总,每个币种在视图C中为单独一列
    3、视图C中增加一行为总计行,并按货币进行小计
    --> liangCK小梁 于2008-10-13
    --> 生成测试数据: #tb1
    IF OBJECT_ID('tempdb.dbo.#tb1') IS NOT NULL DROP TABLE #tb1
    CREATE TABLE #tb1 (姓名 NVARCHAR(4))
    INSERT INTO #tb1
    SELECT '张三' UNION ALL
    SELECT '李四' UNION ALL
    SELECT '王五' UNION ALL
    SELECT '马六' UNION ALL
    SELECT '林七' UNION ALL
    SELECT '朱八'
    --> liangCK小梁 于2008-10-13
    --> 生成测试数据: #tb2
    IF OBJECT_ID('tempdb.dbo.#tb2') IS NOT NULL DROP TABLE #tb2
    CREATE TABLE #tb2 (姓名 NVARCHAR(4),金额 INT,货币 INT)
    INSERT INTO #tb2
    SELECT '张三','1','1' UNION ALL
    SELECT '李四','2','1' UNION ALL
    SELECT '王五','1','2' UNION ALL
    SELECT '马六','1','3' UNION ALL
    SELECT '张三','1','3' UNION ALL
    SELECT '张三','2','1'

    --SQL查询如下:

    SELECT ISNULL(a.姓名,'合计') AS 姓名,
           SUM(CASE WHEN 货币=1 THEN 金额 ELSE 0 END) AS [货币1金额],
           SUM(CASE WHEN 货币=2 THEN 金额 ELSE 0 END) AS [货币2金额],
           SUM(CASE WHEN 货币=3 THEN 金额 ELSE 0 END) AS [货币3金额]
    FROM #tb1 AS a
     LEFT OUTER JOIN
       #tb2 AS b
     ON a.姓名=b.姓名
    GROUP BY a.姓名
    WITH ROLLUP

    /*
    姓名   货币1金额       货币2金额       货币3金额
    ---- ----------- ----------- -----------
    张三   3           0           1
    朱八   0           0           0
    李四   2           0           0
    林七   0           0           0
    王五   0           1           0
    马六   0           0           1
    合计   5           1           2

    (7 行受影响)

    */

    ---
    select * , 工资 = (select max(工资) from tb where 部门ID = t.部门ID) from tb t
    select * from tb where 工资=(select max(工资) from tb )

    [b]select 姓名,max(工资) as 工资,部门 from 部门 group by 部门
    select * from tb a
    where not exists (select 1 from tb where 部门=a.部门 and 员工<>a.员工 and 工资>a.工资)

    select 部门,max(工资) as 最高工资
    from 工资表
    group by 部门

    ----------------------------------------------------------
    用CTE处理表重复数据的更新和删除
    http://blog.csdn.net/roy_88/archive/2008/07/26/2715965.aspx
    处理表重复记录(查询和删除)_整理贴4
    http://topic.csdn.net/u/20080626/00/43d0d10c-28f1-418d-a05b-663880da278a.html

    --处理表重复记录(查询和删除)
    /******************************************************************************************************************************************************
    1、Num、Name相同的重复值记录,没有大小关系只保留一条
    2、Name相同,ID有大小关系时,保留大或小其中一个记录
    整理人:中国风(Roy)

    日期:2008.06.06
    ******************************************************************************************************************************************************/

    --1、用于查询重复处理记录(如果列没有大小关系时2000用生成自增列和临时表处理,SQL2005用row_number函数处理)

    --> --> (Roy)生成測試數據
     
    if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
    Insert #T
    select 1,N'A',N'A1' union all
    select 2,N'A',N'A2' union all
    select 3,N'A',N'A3' union all
    select 4,N'B',N'B1' union all
    select 5,N'B',N'B2'
    Go


    --I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2
    方法1:
    Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID)

    方法2:
    select a.* from #T a join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID

    方法3:
    select * from #T a where ID=(select min(ID) from #T where Name=a.Name)

    方法4:
    select a.* from #T a join #T b on a.Name=b.Name and a.ID>=b.ID group by a.ID,a.Name,a.Memo having count(1)=1

    方法5:
    select * from #T a group by ID,Name,Memo having ID=(select min(ID)from #T where Name=a.Name)

    方法6:
    select * from #T a where (select count(1) from #T where Name=a.Name and ID<a.ID)=0

    方法7:
    select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID)

    方法8:
    select * from #T a where ID!>all(select ID from #T where Name=a.Name)

    方法9(注:ID为唯一时可用):
    select * from #T a where ID in(select min(ID) from #T group by Name)

    --SQL2005:

    方法10:
    select ID,Name,Memo from (select *,min(ID)over(partition by Name) as MinID from #T a)T where ID=MinID

    方法11:

    select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID) as MinID from #T a)T where MinID=1

    生成结果:
    /*
    ID          Name Memo
    ----------- ---- ----
    1           A    A1
    4           B    B1

    (2 行受影响)
    */


    --II、Name相同ID最大的记录,与min相反:
    方法1:
    Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID>a.ID)

    方法2:
    select a.* from #T a join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID order by ID

    方法3:
    select * from #T a where ID=(select max(ID) from #T where Name=a.Name) order by ID

    方法4:
    select a.* from #T a join #T b on a.Name=b.Name and a.ID<=b.ID group by a.ID,a.Name,a.Memo having count(1)=1

    方法5:
    select * from #T a group by ID,Name,Memo having ID=(select max(ID)from #T where Name=a.Name)

    方法6:
    select * from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)=0

    方法7:
    select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID desc)

    方法8:
    select * from #T a where ID!<all(select ID from #T where Name=a.Name)

    方法9(注:ID为唯一时可用):
    select * from #T a where ID in(select max(ID) from #T group by Name)

    --SQL2005:

    方法10:
    select ID,Name,Memo from (select *,max(ID)over(partition by Name) as MinID from #T a)T where ID=MinID

    方法11:
    select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID desc) as MinID from #T a)T where MinID=1

    生成结果2:
    /*
    ID          Name Memo
    ----------- ---- ----
    3           A    A3
    5           B    B2

    (2 行受影响)
    */

     

    --2、删除重复记录有大小关系时,保留大或小其中一个记录


    --> --> (Roy)生成測試數據

    if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
    Insert #T
    select 1,N'A',N'A1' union all
    select 2,N'A',N'A2' union all
    select 3,N'A',N'A3' union all
    select 4,N'B',N'B1' union all
    select 5,N'B',N'B2'
    Go

    --I、Name相同ID最小的记录(推荐用1,2,3),保留最小一条
    方法1:
    delete a from #T a where  exists(select 1 from #T where Name=a.Name and ID<a.ID)

    方法2:
    delete a  from #T a left join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID where b.Id is null

    方法3:
    delete a from #T a where ID not in (select min(ID) from #T where Name=a.Name)

    方法4(注:ID为唯一时可用):
    delete a from #T a where ID not in(select min(ID)from #T group by Name)

    方法5:
    delete a from #T a where (select count(1) from #T where Name=a.Name and ID<a.ID)>0

    方法6:
    delete a from #T a where ID<>(select top 1 ID from #T where Name=a.name order by ID)

    方法7:
    delete a from #T a where ID>any(select ID from #T where Name=a.Name)

     

    select * from #T

    生成结果:
    /*
    ID          Name Memo
    ----------- ---- ----
    1           A    A1
    4           B    B1

    (2 行受影响)
    */


    --II、Name相同ID保留最大的一条记录:

    方法1:
    delete a from #T a where  exists(select 1 from #T where Name=a.Name and ID>a.ID)

    方法2:
    delete a  from #T a left join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID where b.Id is null

    方法3:
    delete a from #T a where ID not in (select max(ID) from #T where Name=a.Name)

    方法4(注:ID为唯一时可用):
    delete a from #T a where ID not in(select max(ID)from #T group by Name)

    方法5:
    delete a from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)>0

    方法6:
    delete a from #T a where ID<>(select top 1 ID from #T where Name=a.name order by ID desc)

    方法7:
    delete a from #T a where ID<any(select ID from #T where Name=a.Name)


    select * from #T
    /*
    ID          Name Memo
    ----------- ---- ----
    3           A    A3
    5           B    B2

    (2 行受影响)
    */

     

     

    --3、删除重复记录没有大小关系时,处理重复值


    --> --> (Roy)生成測試數據
     
    if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([Num] int,[Name] nvarchar(1))
    Insert #T
    select 1,N'A' union all
    select 1,N'A' union all
    select 1,N'A' union all
    select 2,N'B' union all
    select 2,N'B'
    Go

    方法1:
    if object_id('Tempdb..#') is not null
        drop table #
    Select distinct * into # from #T--排除重复记录结果集生成临时表#

    truncate table #T--清空表

    insert #T select * from #    --把临时表#插入到表#T中

    --查看结果
    select * from #T

    /*
    Num         Name
    ----------- ----
    1           A
    2           B

    (2 行受影响)
    */

    --重新执行测试数据后用方法2
    方法2:

    alter table #T add ID int identity--新增标识列
    go
    delete a from  #T a where  exists(select 1 from #T where Num=a.Num and Name=a.Name and ID>a.ID)--只保留一条记录
    go
    alter table #T drop column ID--删除标识列

    --查看结果
    select * from #T

    /*
    Num         Name
    ----------- ----
    1           A
    2           B

    (2 行受影响)

    */

    --重新执行测试数据后用方法3
    方法3:
    declare Roy_Cursor cursor local for
    select count(1)-1,Num,Name from #T group by Num,Name having count(1)>1
    declare @con int,@Num int,@Name nvarchar(1)
    open Roy_Cursor
    fetch next from Roy_Cursor into @con,@Num,@Name
    while @@Fetch_status=0
    begin
        set rowcount @con;
        delete #T where Num=@Num and Name=@Name
        set rowcount 0;
        fetch next from Roy_Cursor into @con,@Num,@Name
    end
    close Roy_Cursor
    deallocate Roy_Cursor

    --查看结果
    select * from #T
    /*
    Num         Name
    ----------- ----
    1           A
    2           B

    (2 行受影响)
    */


    表结构:
    Companies(单位表)
    ------------------
    id
    companyName


    DepartCategories(单位分类)
    ---------------------------
    id
    categoryName
    companyID (外键--单位表)


    DepartMents(部门表)
    --------------------
    id
    departMentName
    departCategoryID(外键--单位分类)


    car (汽车表)
    ------------
    id
    carName
    carNumber
    departMentID(外键--部门表)


    maintenaces(汽车维修记录)
    ---------------------------
    id        主键
    carid      外键
    repairdate 报修日期
    price      金额


    目前:select id,carid,repairdate,price from maintenaces
    返回结果:

    id          carid      repairdate              price
    ----------- ----------- ----------------------- ---------------------------------------
    1          1          2008-07-20 00:00:00.000 250.00
    2          2          2008-05-09 00:00:00.000 10.00
    3          4          2007-10-09 00:00:00.000 20.00
    4          2          2008-10-09 00:00:00.000 20.00
    7          1          2008-06-21 00:00:00.000 0.00
    9          1          2008-08-02 00:00:00.000 0.00
    10          1          2008-06-21 00:00:00.000 800.00
    11          2          2008-05-22 00:00:00.000 0.00
    12          1          2008-07-23 00:00:00.000 0.00


    ------------------------------------------------------------------------
    1.如何用一个存储过程实现上述功能?
    我想统计单车(查询一个车)全部车的年,半年,季,月的维修记录费用汇总报表,结构如下:
    http://topic.csdn.net/u/20080923/10/c685d537-b96e-4c42-8ed5-1462ed7b608e.html
    序号  汽车名称  汽车牌号 使用部门  总计金额
    年,半年,季,月的维修记录费用汇总,在一个存储过程中,这些参数根据条件动态变化,如何实现,
    如按季或月或半年,前提年参数一定要有
     2。我用上面的maintenaces表测试如下

    declare @year char(4)
    set @year='2008'
    declare @Month char(1)
    set @Month='6'

    select c.carName 汽车名称,c.carnumber 汽车牌号,d.departmentName 使用部门,sum(m.price) as 金额总计
    from
      Maintenaces m inner join cars c on  m.carid = c.id
    inner join departMents d on c.departMentID  =  d.id
    inner join DepartCategories dc on d.departCategoryID = dc.id
    inner join Companies cp on dc.companyID = cp.id
    where YEAR(m.repairDate) = @year and
          Month(m.repairDate) = @Month
    group by c.carname,c.carnumber,d.departmentName

    显示

    汽车名称      汽车牌号    使用部门  金额总计
    --------------------------------------------
    大轿车        晋C10695    汽车队    800.00


    可将上面的参数@Month设置为10,查询为空

    汽车名称      汽车牌号    使用部门  金额总计
    --------------------------------------------
    declare @year char(4)
    set @year='2008'
    declare @Month char(1)
    set @Month='6'

    select c.carName 汽车名称,c.carnumber 汽车牌号,d.departmentName 使用部门,sum(m.price) as 金额总计
    from
      Maintenaces m inner join cars c on  m.carid = c.id
    inner join departMents d on c.departMentID  =  d.id
    where YEAR(m.repairDate) = @year and
          Month(m.repairDate) = @Month
    group by c.carname,c.carnumber,d.departmentName

    ---
    Companies(单位表) 
    DepartCategories(单位分类)
    DepartMents(部门表)
    car (汽车表)
    maintenaces(汽车维修记录)

    -----------------------------------------------------
    http://topic.csdn.net/u/20090110/22/97c412d0-f90e-4ab2-8aed-4765e3a6ac21.html
    SQLSERVEER基础语法知识
    having子句是在组上放置条件的
    看例子
    select   orderid sum(orderMoney) from sales where orderid between 3 and 123 group by orderid  having sum(orderMoney)>5
    group by得到了一个记录的集合
    然后通过having子句,再在这个集合上做筛选
    ----------------------------------------------------

     

  • 我的2008工作总结

    2009-01-23 14:55:56

    2008年工作总结

     

    2008年很快就过去了,这一年是多灾多难的一年,对于我个人来说,也是压力最大的一年,但是也是成长迅速的一年。一路从测试这个职业走来,接受的挑战也越来越多,学到的东西也增多,当然也有很多不足。回顾一下自己这一年的工作,对自己也是一个整理和提高。我的总结分以下几部分:

     

    一、年度个人工作改进及成效。

    二、对工作安排的建议。

    三、明年工作设想。

    四、工作建议。

     

    一、年度个人工作改进及成效。

     

    20083-6

    1.         portal测试与上线到demo

    2.         莲花上线测试(重点薪资嵌套测试)

    3.         阿里平台上线与测试

     

    200807

    1.         开发测试流程规范

    2.         莲花功能优化,特别是薪资计算测试(用存储过程改进了算法,速度从7小时缩短至70多秒)、部门树查询问题。

    3.         VSS使用规范。

     

    20088

    1.         SAAS在阿里软件平台的业务测试

    2.         5月份上线,81日转入收费模式,9月份重新划分S0S1S2S3版本,并测试各版本。

     

    20089

    1.         风云软件接入平台测试。

    2.         TD平台搭建和培训。

     

    200810

    1.         数据库基础库重新整理, 数据库脚本的规范。

    2.         vss服务器重新搭建

     

    200811

    1.         全员测试最新版本,测试VSS上最新版本的BUG和数据库,其间发现和处理BUG92

    2.         MSSQL 2005版安装包测试

     

     

    200812

    1.         新增系统需求点测试(此次做了大的功能变动测试主要包括考勤机新算法、薪资重新计算、自定义考勤项目、年假规则自定义、人事模块试用期转正、所有关联试用与正式类别员工处功能)

    2.         公司eHR升级

    3.         mssql 2000版安装包测试

    4.         有序列号的MSSQL2000 安装包测试

     

    200901

    1.         莲花系统功能升级测试:主要在人事模块、考勤分析、年假规则设定、薪资计算模块

    2.         Portal测试

    3.         报表开发

    4.         Express F1  安装包测试

     

     

    二、自我评价

        知识方面

    1、  学会了PHP平台的代码的基本调试方法,对于一些常见错误,能够通过后台调试跟踪。

    2、  学会了SQLSERVER数据库的备份与还原,事件探查器的应用等基本的操作方法

    3、  学会搭建TD测试服务器与VSS服务器的搭建及虚拟机的使用。

    4、  SQL语句书写方面有所加强,但是灵活度不够。

    管理方面

    5、  有时不能分清工作任务的轻重缓急,工作的优先级没有把握好,造成了工作没有很好的协调性,自己忙是在忙,但是没有很好的效率。在这一方面自己一定要加强,不管是领导分配的任务,还是分配下去的任务,一定要把握好时间结点,透彻理解再执行,并要急时跟踪任务的执行情况,这样才能提高效率。

    6、  工作节奏有时不能很好握,处理一些特殊情况的事情很显急躁。有时不能认识到错误和及时改正自己的错误。

    7、  对测试任务的跟踪速度和协调性有所加强,也有所进步。

     

     

    三、明年工作设想

    1、个人目标

    1)  做好自己的售前工作。熟练讲解产品,做好与销售的配合。

    2)  加强自己在数据库知识方面的运用,特别是一些复杂的查询语句,在实施过程和报表开发中会重点应用到;存储过程静态测试,了解内部的算法和能写一些简单的存储过程。

    3)  测试方面,加强对自动化测试工具QTP, Loadrunner的运用,并能够实际运用到项目中,搭建自动化测试平台,写测试脚本。这个将是09年的重点。

    4)  对任务的计划和跟踪方面要加强,合理分配,把握进度,要更有目标感。

     

     

     

    2、明年的计划来展望

    09.02——09.04

    1)能运用QTP搭建起自动化测试平台,把关键的几个模块用自动化方法回归测试,编写测试脚本,并能根据项目需求的变动修改测试脚本。

    2)初步了解性能测试工具loadrunning的测试步骤和方法。

     

    09.04——09.06

    能运用loadrunning模拟用户场景进行基础测试。找到系统性能调优的方法。

     

    09.07——09.12

    能进行性能测试与调优

    1)LR压力测试工具的使用进一步完善使用技巧。(097月)。

     

    2)通过LR进行压力测试,提高对数据库性能问题的定位,尽量做到在不同操作系统不同的数据库环境下都能做到很好的定位问题。(098月)

     

    3)由于目前在定位应用服务器代码级的性能问题还是一个缺陷希望今年上半年通过学习寻找代码级性能问题定位的测试工具来提高自己。(099月)

     

    4)培新测试组成员掌握LR的测试方法(0910月)

    通过PPT、操作手册等LR工具使用文档进行培训,使成员能在最短时间内通过对LR 工具的使用进行压力测试。通过实际项目培训,教会他们如何对脚本的录制、调试(例如:参数化、关联等)、场景环境的设计及压力测试后对测试结果的分析。在碰到性能问题时如何分析问题,描述性能问题文档

     

    四、工作建议

    1、  希望测试部门能够在测试工具LRQTP方面有培训的机会,能正式把这些工具引入到项目中来,能系统的测试速度和性能调优方面做些提高。

     

     

  • 考勤机数据分析测试案例

    2008-12-11 12:54:36

    本周只是从后台来做测试。

    了解了关联的几个表结构,数据流的变化。学到了一些基本的测试语句。

    Update attendance_machine_data_log Set FlashTime=dbo.FROM_UNIXTIME(time_log_stamp,'%Y-%m-%d  %H:%i:%s') Where FlashTime Is Null

    --日期的截取后的年月日查询

    select  * from attendance_machine_data_log 
    where employee_id=16 and CONVERT(varchar(10),FlashTime,102)='2008-10-23'

    --将一个字段的属性改变

    alter table shift_time  ALTER column attendance_rule_id   int  NULL

    --5、创建表A、B、C
    CREATE TABLE A
    (id DECIMAL(9) NOT NULL,
     name CHAR(10));

    CREATE TABLE B
    (id DECIMAL(9) NOT NULL,
     hobby CHAR(10));

    CREATE TABLE C
    (id DECIMAL(9) NOT NULL,
     name CHAR(10));

    --6、增加表字段
    ALTER TABLE C
         add hobbya CHAR(10)

    --7、修改表字段
    ALTER TABLE C
         ALTER COLUMN hobby CHAR(5)

    --8、删除表
    ALTER TABLE C
         DROP COLUMN id

    --9、删除表
    DROP TABLE C

    --10、添加主键
    ALTER TABLE A
         ADD PRIMARY KEY(ID)

    --10、删除主键
    ALTER TABLE A
         DROP PRIMARY KEY(ID)

    --11、创建索引
    CREATE UNIQUE INDEX INDEXID ON A(ID)

    --12、删除索引
    DROP INDEX A.INDEXID

    --13、创建视图
    CREATE VIEW VIEWA
         AS SELECT ID FROM A WHERE ID>100

    --14、删除视图
    DROP VIEW VIEWA

     

    --1.1、查询指定列
    SELECT id FROM A

    --1.2、查询全部列
    SELECT * FROM A
    SELECT ID,NAME FROM A

    --1.3、取消相同取值的行
    SELECT DISTINCT ID FROM A

    --1.4、比较大小
    SELECT * FROM A WHERE ID>5

    --1.5、多重条件查询
    SELECT * FROM A WHERE ID>5 AND NAME='NANCY' OR NAME='TONY'

    --1.6、确认范围查询
    SELECT * FROM A WHERE ID  BETWEEN 1 AND 4
    SELECT * FROM A WHERE ID  NOT BETWEEN 1 AND 4
    --这与下等价
    SELECT * FROM A WHERE ID>=1 AND ID<=4
    SELECT * FROM A WHERE ID<1 OR ID>4

    --1.7、确认集合
    SELECT * FORM A WHERE ID IN  (1,2,3)

    --1.8字符匹配查询
    --查询Northwind数据库中orders表的ShipCountry列以B,C,D,F开始且第三个字
     -- ,符为“a”的OrderlD、CustomerID和ShipCountry的信息。
    SELECT ORDERID,CUSTOMERID,SHIPCOUNTRY FROM ORDERS WHERE SHIPCOUNTRY LIKE '[BCDF]%' AND SHIPCOUNTRY LIKE '__A%'

    --1.9空值查询
    SELECT * FROM A WHERE ID IS  NULL

    --1.10常用库函数及统计汇总查询
      SELECT ID,NAME FROM A
     Where ID=(select max(ID) from A)

    --1.11分组查询
    SELECT ID FROM A GROUP BY ID HAVING ID>0

    --1.12对查询结果进行排序
    SELECT * FROM A ORDER BY ID,NAME DESC

    --1.13数据表连接查询
    ----A、内联接
    select A.Name,B.Hobby from A, B where A.id = B.id
    select A.Name,B.Hobby from A Inner join B ON A.id = B.id

    ----B、左外联接
    select A.Name,B.Hobby from A Left join B ON A.id = B.id

    ----C、右外联接
    select A.Name,B.Hobby from A Right join B ON A.id = B.id

    ----D、此句以上右外联接结果是一样的
    select A.Name,B.Hobby from B Left join A ON A.id = B.id

    ----E、全联接,以下两句同
    select A.Name,B.Hobby from A cross join B
    select A.Name,B.Hobby from A,B

    --1.14使用TOP限制结果集
    SELECT TOP 3 WITH TIES ID,NAME FROM A ORDER BY ID

    --1.15将查询结果存入表中
    SELECT * INTO #TEMP FROM A
    SELECT * INTO ##TEMP1 FROM A
    SELECT * INTO D FROM A

    --1.16合并查询
    SELECT * FROM A
    UNION
    SELECT * FROM B

    --1.17子查询
    --A、使用子查询进行比较测试
        SELECT ID,NAME FROM A
        WHERE NAME='NANCY'
        and ID>( SELECT AVG(ID) from B)

    --B、使用子查询基于集合的测试
        SELECT * FROM A
        WHERE ID IN
        (SELECT ID FROM B)

    --C、使用子查询进行存在性测试
        SELECT NAME FROM A  
        WHERE EXISTS
        (SELECT * FROM B
        WHERE ID=A.ID)

    --2.1插入一行新记录
    INSERT INTO A(ID,NAME) VALUES(1,'TONY')

    --2.2插入一行的部分数据值
    INSERT INTO A(ID) VALUES(2)

    --2.3插入多行记录
    INSERT INTO B(ID,HOBBY) SELECT * FROM A

    --2.4修改数据
    UPDATE A
    SET NAME='NANCY' WHERE ID=2

    UPDATE A
    SET NAME='A' WHERE ID IN(SELECT ID FROM B)

    --2.5删除记录
    DELETE A WHERE ID=2
    DELETE A WHERE ID IN(SELECT ID FROM B)


    ---随机取出两条数据
    select top 2 * from B order by newid()

    ---列出数据库里所有的表名
    select name from sysobjects where type='U'

    ---列出表里所有的列
    select name from syscolumns where id=object_id('B')

    ---初始化表,将内容清空
    TRUNCATE TABLE A

     

    --其次,大家来看一些不错的sql语句
    --1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    --法一:where 1 <>1 或用where 1=1在程序里是经常使用的,后面可根据加个多个条件也可不加,非常灵活
    select * into b from a where 1 <>1
    --法二:
    select top 0 * into b from a

    --2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b

    --3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    --例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    --4、说明:两张关联表,删除主表中已经在副表中没有的信息 
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    --5、说明:四表联查问题:
    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 .....

    --6、说明:日程安排提前五分钟提醒 
    select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    --7、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
    select top 10 yonghu.* from (select top 20 * from yonghu)a,yonghu where a.yhdm=yonghu.yhdm

    --8、说明:前10条记录
    select top 10 * FROM table1 where 范围

    --9、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    --10、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    --11、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    --12、说明:随机选择记录
    select newid()

    --13、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    --14、说明:列出数据库里所有的表名
    select name from sysobjects where type='U' 

    --15、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')
    select name from syscolumns where id=object_id('yonghu')

    --16、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    --17、说明:初始化表table1
    TRUNCATE TABLE table1

    --18、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
     
    --随机读取若干条记录,测试过
    --Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
    --Sql server:select top n * from 表名 order by newid()
    --mysql:select * From 表名 Order By rand() Limit n
    --使用SQL语句 用...代替过长的字符串显示
    --语法:
    --SQL数据库:
    select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    ---=Access数据库:
    SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename; 
     

    --19、查询时字符串连接(用+号)
    select id+'['+name+']' YH from a

  • win2003系统80端口被占用.有什么解决方法吗?

    2008-10-31 10:06:24

    win2003系统80端口被占用.有什么解决方法吗?
    我用的是win2003系统.我在家里设置独立FTP.但AspWebserver2005需要80端口.可是80端口总是被占用.我用msconfig命令取消了所以启动项可是..80端口还是被占用......我也没有安装<迅雷>..不晓得那个高手可以教我一下.

    看下你是不是开了迅雷。
    转自互联网。
    解决:在win03的cmd命令窗口输入netstat -abn ->c:/port80.txt 然后到c盘port80.txt文件中找到占用80端口的程序pid,记下pid。打开任务管理器,点击“查看”/选择列,勾选“PID(进程标识符)”,然后单击“进程”标签,找到80端口对应的pid,就可以看到是那个程序占用的了,更改这个程序的port,再重启这个程序,使更改生效。再次启动iis,一切ok。我是安装apache提示端口占用,用同样的方法,以前很少遇到,这次是应为安装的迅雷bt把80端口占用了,用上面的方法,顺利解决

  • 利用单元测试在每个层上对PHP代码进行检查发布

    2008-10-31 10:03:46

    利用单元测试在每个层上对PHP代码进行检查发布: 2008-7-24 14:53
    作者: 网络转载 | 来源: 网络转载 | 查看: 0次 | 进入软件测试时代论坛讨论
    软件测试时代


    测试驱动的开发和单元测试是确保代码在经过修改和重大调整之后依然能如我们期望的一样工作的最新方法。在本文中,您将到如何在模块、用户界面(UI)层对自己的PHP代码进行单元测试。

    现在是凌晨 3 点。我们怎样才能知道自己的代码依然在工作呢?
    Web 应用程序是 24x7 不间断运行的,因此我的程序是否还在运行这个问题会在晚上一直困扰我。单元测试已经帮我对自己的代码建立了足够的信心 —— 这样我就可以安稳地睡个好觉了。
    单元测试 是一个为代码编写测试用例并自动运行这些测试的框架。测试驱动的开发 是一种单元测试方法,其思想是应该首先编写测试程序,并验证这些测试可以发现错误,然后才开始编写需要通过这些测试的代码。当所有测试都通过时,我们开发的特性也就完成了。这些单元测试的价值是我们可以随时运行它们 —— 在签入代码之前,重大修改之后,或者部署到正在运行的系统之后都可以。
    PHP 单元测试
    对于 PHP 来说,单元测试框架是 PHPUnit2。可以使用 PEAR 命令行作为一个 PEAR 模块来安装这个系统:% pear install PHPUnit2。
    在安装这个框架之后,可以通过创建派生于 PHPUnit2_Framework_TestCase 的测试类来编写单元测试。
    模块单元测试
    我发现开始单元测试最好的地方是在应用程序的业务逻辑模块中。我使用了一个简单的例子:这是一个对两个数字进行求和的函数。为了开始测试,我们首先编写测试用例,如下所示。

    清单 1. TestAdd.php
    assertTrue( add( 1, 2 ) == 3 ); }
      function test2() { $this->assertTrue( add( 1, 1 ) == 2 ); }
    }
    ?>

    这个 TestAdd 类有两个方法,都使用了 test前缀。每个方法都定义了一个测试,这个测试可以与清单 1 一样简单,也可以十分复杂。在本例中,我们在第一个测试中只是简单地断定 1 加 2 等于 3,在第二个测试中是 1 加 1 等于 2。
    PHPUnit2 系统定义了 assertTrue() 方法,它用来测试参数中包含的条件值是否为真。然后,我们又编写了 Add.php 模块,最初让它产生错误的结果。

    清单 2. Add.php

    现在运行单元测试时,这两个测试都会失败。

    清单 3. 测试失败
    % phpunit TestAdd.php
    PHPUnit 2.2.1 by Sebastian Bergmann.
    FF
    Time: 0.0031270980834961
    There were 2 failures:
    1) test1(TestAdd)
    2) test2(TestAdd)
    FAILURES!!!
    Tests run: 2, Failures: 2, Errors: 0, Incomplete Tests: 0.

    现在我知道这两个测试都可以正常工作了。因此,可以修改 add() 函数来真正地做实际的事情了。

    现在这两个测试都可以通过了。

    清单 4. 测试通过
    % phpunit TestAdd.php
    PHPUnit 2.2.1 by Sebastian Bergmann.
    ..
    Time: 0.0023679733276367
    OK (2 tests)%
    尽管这个测试驱动开发的例子非常简单,但是我们可以从中体会到它的思想。我们首先创建了测试用例,并且有足够多的代码让这个测试运行起来,不过结果是错误的。然后我们验证测试的确是失败的,接着实现了实际的代码使这个测试能够通过。
    我发现在实现代码时我会一直不断地添加代码,直到拥有一个覆盖所有代码路径的完整测试为止。在本文的最后,您会看到有关编写什么测试和如何编写这些测试的一些建议。

    数据库测试
    在进行模块测试之后,就可以进行数据库访问测试了。数据库访问测试 带来了两个有趣的问题。首先,我们必须在每次测试之前将数据库恢复到某个已知点。其次,要注意这种恢复可能会对现有数据库造成破坏,因此我们必须对非生产数据库进行测试,或者在编写测试用例时注意不能影响现有数据库的内容。
    数据库的单元测试是从数据库开始的。为了阐述这个问题,我们需要使用下面的简单模式。
    清单 5. Schema.sql
    DROP TABLE IF EXISTS authors;
    CREATE TABLE authors (
      id MEDIUMINT NOT NULL AUTO_INCREMENT,
      name TEXT NOT NULL,
      PRIMARY KEY ( id )
    );

    清单 5 是一个 authors 表,每条记录都有一个相关的 ID。
    接下来,就可以编写测试用例了。

    清单 6. TestAuthors.php
    assertTrue( Authors::delete_all() );
      }
      function test_insert() {
         $this->assertTrue( Authors::delete_all() );
         $this->assertTrue( Authors::insert( 'Jack' ) );
      }
      function test_insert_and_get() {
         $this->assertTrue( Authors::delete_all() );
         $this->assertTrue( Authors::insert( 'Jack' ) );
         $this->assertTrue( Authors::insert( 'Joe' ) );
         $found = Authors::get_all();
         $this->assertTrue( $found != null );
         $this->assertTrue( count( $found ) == 2 );
      }
    }
    ?>

    这组测试覆盖了从表中删除作者、向表中插入作者以及在验证作者是否存在的同时插入作者等功能。这是一个累加的测试,我发现对于寻找错误来说这非常有用。观察一下哪些测试可以正常工作,而哪些测试不能正常工作,就可以快速地找出哪些地方出错了,然后就可以进一步理解它们之间的区别。
    最初产生失败的 dblib.php PHP 数据库访问代码版本如下所示。
    清单 7. dblib.php
    getMessage()); }
        return $db;
      }
      public static function delete_all()
      {
        return false;
      }
      public static function insert( $name )
      {
        return false;
      }
      public static function get_all()
      {
        return null;
      }
    }
    ?>
    对清单 8 中的代码执行单元测试会显示这 3 个测试全部失败了:
    清单 8. dblib.php
    % phpunit TestAuthors.php
    PHPUnit 2.2.1 by Sebastian Bergmann.
    FFF
    Time: 0.007500171661377
    There were 3 failures:
    1) test_delete_all(TestAuthors)
    2) test_insert(TestAuthors)
    3) test_insert_and_get(TestAuthors)
    FAILURES!!!
    Tests run: 3, Failures: 3, Errors: 0, Incomplete Tests: 0.
    %

    现在我们可以开始添加正确访问数据库的代码 —— 一个方法一个方法地添加 —— 直到所有这 3 个测试都可以通过。最终版本的 dblib.php 代码如下所示。
    清单 9. 完整的 dblib.php
    getMessage()); }
        return $db;
      }
      public static function delete_all()
      {
        $db = Authors::get_db();
        $sth = $db->prepare( 'DELETE FROM authors' );
        $db->execute( $sth );
        return true;
      }
      public static function insert( $name )
      {
        $db = Authors::get_db();
        $sth = $db->prepare( 'INSERT INTO authors VALUES (null,?)' );
        $db->execute( $sth, array( $name ) );
        return true;
      }
      public static function get_all()
      {
        $db = Authors::get_db();
        $res = $db->query( "SELECT * FROM authors" );
        $rows = array();
        while( $res->fetchInto( $row ) ) { $rows []= $row; }
        return $rows;
      }
    }
    ?>

    在对这段代码运行测试时,所有的测试都可以没有问题地运行,这样我们就可以知道自己的代码可以正确工作了。

    HTML测试

    对整个 PHP 应用程序进行测试的下一个步骤是对前端的超文本标记语言(HTML)界面进行测试。要进行这种测试,我们需要一个如下所示的 Web 页面。
    这个页面对两个数字进行求和。为了对这个页面进行测试,我们首先从单元测试代码开始入手。
    清单 10. TestPage.php
    get( $url );
        $resp = $client->currentResponse();
        return $resp['body'];
      }
      function test_get()
      {
        $page = TestPage::get_page( 'http://localhost/unit/add.php' );
        $this->assertTrue( strlen( $page ) > 0 );
        $this->assertTrue( preg_match( '//', $page ) == 1 );
      }
      function test_add()
      {
        $page = TestPage::get_page( 'http://localhost/unit/add.php?a=10&b=20' );
        $this->assertTrue( strlen( $page ) > 0 );
        $this->assertTrue( preg_match( '//', $page ) == 1 );
        preg_match( '/(.*?)/', $page, $out );
        $this->assertTrue( $out[1]=='30' );
      }
    }
    ?>

    这个测试使用了 PEAR 提供的 HTTP Client 模块。我发现它比内嵌的 PHP Client URL Library(CURL)更简单一点儿,不过也可以使用后者。
    有一个测试会检查所返回的页面,并判断这个页面是否包含 HTML。第二个测试会通过将值放到请求的 URL 中来请求计算 10 和 20 的和,然后检查返回的页面中的结果。
    这个页面的代码如下所示。

    清单 11. TestPage.php
    " /> +
    " /> =

    这个页面相当简单。两个输入域显示了请求中提供的当前值。结果 span 显示了这两个值的和。 标记标出了所有区别:它对于用户来说是不可见的,但是对于单元测试来说却是可见的。因此单元测试并不需要复杂的逻辑来找到这个值。相反,它会检索一个特定  标记的值。这样当界面发生变化时,只要 span 存在,测试就可以通过。
    与前面一样,首先编写测试用例,然后创建一个失败版本的页面。我们对失败情况进行测试,然后修改页面的内容使其可以工作。结果如下:
    清单 12. 测试失败情况,然后修改页面
    % phpunit TestPage.php
    PHPUnit 2.2.1 by Sebastian Bergmann.
    ..
    Time: 0.25711488723755
    OK (2 tests)
    %

    这两个测试都可以通过,这就意味着测试代码可以正常工作。
    不过对 HTML 前端的测试有一个缺陷:Javascrīpt。超文本传输协议(HTTP)客户机代码对页面进行检索,但是却没有执行 Javascrīpt。因此如果我们在 Javascrīpt 中有很多代码,就必须创建用户代理级的单元测试。我发现实现这种功能的最佳方法是使用 Microsoft? Internet Explorer? 内嵌的自动化层功能。通过使用 PHP 编写的 Microsoft Windows? 脚本,可以使用组件对象模型(COM)接口来控制 Internet Explorer,让它在页面之间进行导航,然后使用文档对象模型(DOM)方法在执行特定用户操作之后查找页面中的元素。


    这是我了解的对前端 Javascrīpt 代码进行单元测试的惟一一种方法。我承认它并不容易编写和维护,这些测试即使在对页面稍微进行改动时也很容易遭到破坏。
    编写哪些测试以及如何编写这些测试
    在编写测试时,我喜欢覆盖以下情况:
    所有正面测试
    这组测试可以确保所有的东西都如我们期望的一样工作。
    所有负面测试
    逐一使用这些测试,从而确保每个失效或异常情况都被测试到了。
    正面序列测试
    这组测试可以确保按照正确顺序的调用可以像我们期望的一样工作。
    负面序列测试
    这组测试可以确保当不按正确顺序进行调用时就会失败。
    负载测试
    在适当情况下,可以执行一小组测试来确定这些测试的性能在我们期望的范围之内。例如,2,000 次调用应该在 2 秒之内完成。
    资源测试
    这些测试确保应用编程接口(API)可以正确地分配并释放资源 —— 例如,连续几次调用打开、写入以及关闭基于文件的 API,从而确保没有文件依然是被打开的。
    回调测试
    对于具有回调方法的 API 来说,这些测试可以确保如果没有定义回调函数,代码可以正常运行。另外,这些测试还可以确保在定义了回调函数但是这些回调函数操作有误或产生异常时,代码依然可以正常运行。
    这是有关单元测试的几点想法。有关如何编写单元测试,我也有几点建议:

    1.不要使用随机数据

    尽管在一个界面中产生随机数据看起来貌似一个好主意,但是我们要避免这样做,因为这些数据会变得非常难以调试。如果数据是在每次调用时随机生成的,那么就可能产生一次测试时出现了错误而另外一次测试却没有出现错误的情况。如果测试需要随机数据,可以在一个文件中生成这些数据,然后每次运行时都使用这个文件。采用这种方法,我们就获得了一些 “噪音” 数据,但是仍然可以对错误进行调试。

    2.分组测试

    我们很容易累积起数千个测试,需要几个小时才能执行完。这没什么问题,但是对这些测试进行分组使我们可以快速运行某组测试并对主要关注的问题进行检查,然后晚上运行完整的测试。

    3.编写稳健的 API 和稳健的测试

    编写 API 和测试时要注意它们不能在增加新功能或修改现有功能时很容易就会崩溃,这一点非常重要。这里没有通用的绝招,但是有一条准则是那些 “振荡的” 测试(一会儿失败,一会儿成功,反复不停的测试)应该很快地丢弃。

    结束语
    单元测试对于工程师来说意义重大。它们是敏捷开发过程(这个过程非常强调编码的作用,因为文档需要一些证据证明代码是按照规范进行工作的)的一个基础。单元测试就提供了这种证据。这个过程从单元测试开始入手,这定义了代码应该 实现但目前尚未 实现的功能。因此,所有的测试最初都会失败。然后当代码接近完成时,测试就通过了。当所有测试全部通过时,代码也就变得非常完善了。
    我从来没有在不使用单元测试的情况下编写大型代码或修改大型或复杂的代码块。我通常都是在修改代码之前就为现有代码编写了单元测试,这样可以确保自己清楚在修改代码时破坏了什么(或者没有破坏什么)。这为我对自己提供给客户的代码提供了很大的信心,相信它们正在正确运行 —— 即便是在凌晨 3 点。

  • 由于这台计算机没有终端服务器客户端访问许可证,远程会话被中断

    2008-10-31 09:52:59

    由于这台计算机没有终端服务器客户端访问许可证,远程会话被中断(zt)
    ===========================================================
    作者: tonykorn97(http://tonykorn97.itpub.net)
    发表于: 2007.11.19 11:12
    分类: windows
    出处: http://tonykorn97.itpub.net/post/6414/414300
    ---------------------------------------------------------------

    问题:使用[远程桌面连接]到win2003 server
    消息:[由于这台计算机没有终端服务器客户端访问许可证,远程会话被中断。请跟服务器管理员联系。]


    由于这台计算机没有终端服务器客户端访问许可证,远程会话被中断。请与服务器管理员联系。


    原因: 许可证服务器中可能没有剩余的“每设备 CAL”来颁发。
    解决方案: 使用终端服务器授权来确定许可证服务器中所剩 CAL 的数量。要打开终端服务器授权,请依次单击“开始”、“程序”、“管理员工具”,然后指向“终端服务器授权”。如果许可证服务器中没有剩余的 CAL 颁发给客户端,那么请根据需要购买并安装其他 CAL。
    另请参阅: 购买客户端访问许可证;安装客户端访问许可证;购买并在终端服务器许可证服务器上安装客户端访问许可证
    原因: 终端服务器中的终端服务器授权模式可能设置为“每设备”,而许可证服务器可能仅有“每用户 CAL”。如果是这种情况,那么许可证服务器将仅颁发临时许可证,这是不能升级的。当临时许可证还有几天即将过期时,“事件 ID 26,源:应用程序弹出消息”将显示在客户端上的应用程序事件日志中。该事件消息指出临时许可证还有多少天即将过期。与此类似,“事件 ID 1011,源 TermService”也将显示在终端服务器上的应用程序事件日志中。
    解决方案: 将终端服务器授权模式从“每设备”更改为“每用户”。
    要点
    终端服务器不监视每用户 CAL。这意味着即使许可证服务器数据库中只有一个每用户 CAL,使用它时,每用户 CAL 也不会减少。它不会通过从最终用户许可协议 (EULA) 要求中删除管理员来为每一个用户提供有效的终端服务器 CAL。如果未在使用每设备 CAL 却无法为每个用户获取一个每用户 CAL,则违反了 EULA。
    请参阅以下文本,该文本选自 Windows Server 2003 的 EULA:
    “您可以使用两种不同的 TS CAL:“设备”和“用户”。每个 TS 设备 CAL 允许一个设备(由任何用户使用)执行任何服务器上的 Windows 会话。每个 TS 用户 CAL 允许一个用户(使用任何设备)执行任何服务器上的 Windows 会话。您可同时混合使用 TS 设备 CAL 和 TS 用户 CAL,并可以将其与环境中的服务器软件同时使用。您可以让终端服务器请求每用户许可证或每设备许可证(默认值),但不能同时请求两种许可证。”
    另请参阅: 配置终端服务器授权模式
    原因: 终端服务器可能找不到许可证服务器。
    解决方案: 请执行以下步骤:
    1.确认是否已正确安装许可证服务器。
    2.确认终端服务器授权服务是否正在许可证服务器上运行。
    3.通过确保在每一台计算机上正确配置了域名系统 (DNS),验证客户端、终端服务器和许可证服务器可以通讯。要完成上述操作,请在每台计算机上使用 IP 地址、FQDN 和 NetBIOS 名称分别针对其他两台计算机运行 ping 命令。如果任何 ping 命令失败,请验证网络上的 DNS 配置。
    4.在终端服务器上,设置一个要连接到的首选授权服务器。通过如下方法可完成该操作:使用注册表、WMI 脚本,或者在带有 Service Pack 1 的 Windows Server 2003 中,使用组策略设置或终端服务器配置。
    另请参阅: 安装终端服务器授权;设置首选终端服务器许可证服务器;终端服务器许可证服务器角色
    解决方案: 如果上一个解决方案不能解决此问题,请在客户端上创建一个 MSLicensing 注册表项及其子项的备份,然后执行下列操作删除原始项和子项:
    1.在客户端上,导航到下列注册表子项:HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing。
    2.单击 MSLicensing。
    3.在“注册表”菜单上,单击“导出注册表文件”。
    4.在“文件名”框中,键入 mslicensingbackup,然后单击“保存”。
    如果以后需要还原此注册表项,请双击 mslicensingbackup.reg。
    5.在“编辑”菜单上,单击“删除”,然后单击“是”确认删除 MSLicensing 注册表子项。
    6.关闭注册表编辑器并重新启动计算机。

    客户端重新启动时,将重新创建缺少的注册表项。
    警告
    编辑注册表不当可能会严重损坏您的系统。在更改注册表之前,应备份计算机上任何有价值的数据。
    请参阅: 如何在 Windows 2000 中使用 RestrictAnonymous 注册表值 (http://go.microsoft.com/fwlink/?LinkId=38561)

    另请参阅: 终端服务器授权宽限期;安装终端服务器授权;激活终端服务器许可证服务器;购买客户端访问许可证;安装客户端访问许可证; 购买并在终端服务器许可证服务器上安装客户端访问许可证;激活终端服务器许可证服务器。

     

  • TD中字体大小改变的方法(实验成功的)

    2008-10-31 09:50:37

    用于TD7.6 Sp4
    该文档是解决客户端汉字大小问题的!(此方法在TD8中也同样生效)

    可以将此文件放到TD的安装目录下的install目录(改名为:TDClientUI.xco),然后修改tdbin目录下的setup_a.ini文件,修改其中的内容:

    在[File_2]的段内容中,将其下的这部分修改:
    ;CheckSize=2447576
    将其大小改为现在的这个文件的大小
    如:CheckSize=2443776

    这样子修改,客户端会自动下载该控件,达到字体变大的效果!

    同时感谢提供该控件的作者.

672/4<1234>
Open Toolbar