1、用SysComments的原因

最近新模块的开发,需要更改和新增的存储过程比较多,为了同步开发环境和测试环境的存储过程,能在更新程序后,马上能整理出更改的存储过程脚本,并更新到测试DB服务器上,我用了SqlServer的系统表SysComments,它记录了数据库中所有的对象,当然包括了存储过程,该表有个text字段,它记录了sql定义的脚本内容,如果是存储过程,则记录的存储过程脚本。用它,可以写批量sql语句,直接帮助同步存储过程到测试数据库,因为为了和以后生成环境更新方式一致,需要整理出脚本,因此采用了sql语句获取存储过程内容的方式。

2、遇到问题

在获取存储过程脚本中,遇到了问题,就是更改了存储过程名字后,通过SysComments的text字段获取到的存储过程内容,存储过程名称还是更改前的名称,比如以前存储过程名称叫abc,更改为def,但查询SysComments的text字段内容,同样为create procedure abc。。。这样当每次更新4,50个存储过程,甚至更多的时候,测试系统会发生莫名其妙的问题,因为没有真正更改到需要修改或新增的存储过程。比如,我们先按照最后修改日期查询出最近更改的存储过程:

SELECT TOP 30 a.[name], a.crdate, a.refdate, b.[text]

from sysobjects a, syscomments b

where a.id = b.id and

a.xtype = 'p'

ORDER BY a.refdate DESC

或者用下面的系统视图查询:

SELECT TOP 10 ir.SPECIFIC_NAME, ir.CREATED, ir.LAST_ALTERED

FROM INFORMATION_SCHEMA.ROUTINES ir

ORDER BY ir.LAST_ALTERED DESC

然后查询某一条存储过程内容:

sp_helptext UP_KERNAL_USR_SP_GetListByConsumerID

按常理,这里获取到的脚本,就可以作为该存储过程的更新脚本,但如果存储过程是更改了名称,而没有更改内容,则这个脚本的存储过程名称有可能就不正确了。经过测试,如果修改了存储过程内容,SysComments表中的text字段才会更新为正确的内容,猜测是内容有触发机制,没有更改内容就不触发同步数据到系统表存储,所以只更改名称,SysComments表中的text字段内容没有更新。

3、相关资料:

经过查询,发现微软官网的帮助和支持里有说明:PRB: Renaming Stored Procedure, View or Trigger does not update SYSCOMMENTS table

,具体链接:http://support.microsoft.com/kb/243198/en-us,大概说了确实有这个问题,文章并且说了该问题存在于SQL2005各个版本及以下部分版本,解决方法是删除老存储过程,再创建新存储过程,当然对于不从SysComments的text字段取内容的情况下,直接改名字没什么影响。但该文章是2003年11月14日的,对现在是否有补丁或处理方式,不得而知。

4、总结

我本地Microsoft SQL Server 2005 - 9.00.3042.00版本的SqlServer依然有这个问题,临时解决办法,只有获取内容后,再修改存储过程名称的方式。以后如果用sql脚本读取SysComments的text字段来获取存储过程,需要注意到存储过程名称是否有问题。当然非脚本的手工操作,可以保证不会出现问题,选中数据库-右键-任务-导出脚本。

其他非官方网站也很少搜索到相关内容,如描述有问题,请指出,谢谢!

转载于:https://www.cnblogs.com/Lawson/archive/2011/05/30/2063370.html

Sqlserver别太信任SysComments表中的text字段相关推荐

  1. sql中的text字段如何导入oracle

    这一段时间在把SQLSERVER迁移到ORASCLE,中间遇到了一系列的问题,通过查找资料和想办法,已经基本顺利解决,后面我会针对两个数据库迁移过程中我遇到的问题,整理汇总成一个个小问题,带着实例编码 ...

  2. SqlServer表中添加新字段

    表中添加新字段 ALTER TABLE 表名 ADD 字段名 VARCHAR(20) NULL 表中添加自增id alter table lianxi add id int primary key I ...

  3. 如何向 Oracle 表中的 Date 字段插入日期及时间

    如何向 Oracle 表中的 Date 字段插入日期及时间  Oracle中与sqlserver 插入日期型数据时,有比较大的区别.sqlserver中,直接把日期型数据用单引号括起来就可以,而Ora ...

  4. 243 mysql获取某个表中除了某个字段名外的所有字段名

    SELECTGROUP_CONCAT( column_name SEPARATOR ',' ) FROMinformation_schema.COLUMNS WHEREcolumn_name < ...

  5. SQL 触发器 当修改TEST表中的F1字段时,同时根据条件修改F2字段

    Code --当外修改TEST表中的F1字段时,同时根据条件修改F2字段 ALTER TRIGGER [dbo].[updatetest1] ON [dbo].[TEST]  FOR INSERT,  ...

  6. mysql 查询指定字段数据_MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...

  7. 修改Mysql表中自增字段的初始值

    修改Mysql表中自增字段的初始值: ALTER TABLE employee AUTO_INCREMENT=2; 解释:将表employee自增字段的初始值设置为2

  8. 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?

    编辑器加载中... 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?多表联结查询:select rbd.RBDID, rbd.ProductCode,p.ProductCnName,p. ...

  9. WSS 数据库表中的 UserInfo 表中的 tp_SystemId 字段的使用

    在 WSS 的数据库中,UserInfo表的 tp_SystemId 记录的是用户登录验证时需要用到的数据,是此用户在 AD( Active Directory ) 中的 SID( Security ...

最新文章

  1. 【二级java】二叉树序列
  2. POJ 3468 A Simple Problem with Integers
  3. 缺少资源,打印机操作无法继续,打印机子系统不可用
  4. 计算机主键盘的布局,计算机键盘的布局,结构和布置
  5. mysql存储引擎简介
  6. 基于华为云的Django网站部署
  7. mysql数据库提示本地无法连接远程服务器(Host is not allowed to connect to this MySQL server)解决办法
  8. 使用VS2019创建项目,添加文件和库地址
  9. <笔记>光纤(光波导)中的传输特性1
  10. silverlight(二)样式
  11. 铁岭市奔腾计算机学校地址,辽宁省铁岭市奔腾计算机职业高级中学2020年高三数学理上学期期末试题.docx...
  12. hdu 4928 Series 2 (优化+模拟)
  13. 移动边缘计算中的资源管理
  14. 如何解决语音社交的安全隐忧
  15. Android逆向Unity3D——XXX快跑破解
  16. 新浪微博开发者平台应用申请及配置说明
  17. 手机淘宝app、xsign签名算法
  18. c语言文件不兼容,c)出错和链接问题:i386:x86-64输入文件架构,与i386输出不兼容...
  19. 计算机读心术的原理,读心术的原理笑容的奥秘
  20. 淘宝MySQL数据库高可用实现方案

热门文章

  1. 删除隐藏版本信息 版本回退_Qt如何给程序添加版本信息
  2. onclick 调用php,AJAX调用PHP简单应用
  3. maven 分批打包_maven批量打包,并且显示打包结果
  4. c语言编程基础课件,第7章_C语言图形编程基础课件
  5. ROS2 on android,ROS2 通过Debian安装ROS2
  6. php 初始化漏洞,这样做是不是不会引起PHP全局变量未初始化漏洞
  7. 是不是一个东西_迷你世界:一个金币就能买到稀有武器?这么良心的售货机在哪领...
  8. python程序详细描述_如何逐行描述Python代码?
  9. 函数运用_月隐学python第10课
  10. android复位机器人图片,安卓(Android)新图标!小绿机器人换脸啦