nav-left cat-right
cat-right
Sqlserver生成随机数的一些应用

Sqlserver虽然有rand()函数可以用,但单纯用rand()来获取随机数有很多限制,因为rand()生成的是类似0.747589267212168的随机小数,灵活处理一下就可以得到整数
1.select cast(ceiling(rand() * N) as int) //生成的数是N以内的证书
2.select cast(ceiling(rand(checksum(newid()))*N) as int) 这个同上,但在批量操作时往往这个会更有用,如
update table set field=cast(ceiling(rand() *5 ) as int) 和update table set field=cast(ceiling(rand(checksum(newid()))*N) as int)产生的效果就完全不同,前者虽然也是生成随机数了,但是所有table表里的field字段的数值都是一样的,而后者就各不相同,原理就是1是先生成随机数,然后再更新,2是更新每条记录前生成随机数。
3.将上面俩条语句中的ceiling换成floor就可以生成包含0的整数随机数。
4.随机查询得到N条记录用order by newid(),语句是select top N * from table order by newid()

PHP SQLServer TEXT字段被截断

一、针对MS SQL SERVER数据库

      有两种解决方案,如下:

修改php.ini来实现:
      打开php.ini,可看到mssql.textsize,mssql.textlimit两个选项:

      ; Valid range 0 – 2147483647. Default = 4096.

      ;mssql.textlimit = 4096

      ; Valid range 0 – 2147483647. Default = 4096.
      ;mssql.textsize = 4096

      可以看到默认配置为4096字节,也就是经常碰到的被截断为4K,将之改为合适的大小,去掉前面的分号,然后保存并重起WEB服务器即可。

      从上面两个选项可看到范围为:0 – 2147483647字节,其实-1也可以的,查看一下PHP源代码即可发现-1表示无限制 :)

      if (MS_SQL_G(textlimit) != -1) {
            sprintf(buffer, “%li”, MS_SQL_G(textlimit));
            if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) {
                  efree(hashed_details);
                  dbfreelogin(mssql.login);
                  RETURN_FALSE;
            }
      }
      if (MS_SQL_G(textsize) != -1) {
            sprintf(buffer, “SET TEXTSIZE %li”, MS_SQL_G(textsize));
            dbcmd(mssql.link, buffer);
            dbsqlexec(mssql.link);
            dbresults(mssql.link);
      }

在PHP中查询之前执行SET TEXTSIZE 合适的大小:
      只需在SELECT之前执行

      mssql_query(“SET TEXTSIZE 65536″);

      从上面PHP源代码中可看到其实也是执行SET TEXTSIZE的 :)

二、针对Sybase数据库

      由于该扩展在php.ini没有像SQL SERVER那样的选项可配置,所以只有采用上面的第二种方法,即:

      在SELECT之前执行

      sybase_query(“SET TEXTSIZE 65536″);