代码之家  ›  专栏  ›  技术社区  ›  CaffGeek

如何在syscomments中查找文本错误的存储过程

  •  2
  • CaffGeek  · 技术社区  · 14 年前

    似乎有多个存储过程被重命名为sp_rename,导致syscomments保留旧的proc名称而不是新的proc名称。

    因此,我的数据库传输无法正确传输。

    有没有办法找出哪些进程(或任何对象)的名称不同步?

    或者更好的是,找到并修复它们的简单方法?

    1 回复  |  直到 13 年前
        1
  •  3
  •   Martin Smith    13 年前

    你可以试试

    select object_name(id)
    from syscomments 
    WHERE COLID=1 AND
    OBJECTPROPERTY(id, 'isprocedure')=1 and
    REPLACE(REPLACE(TEXT,CHAR(13),' '),CHAR(10),' ') 
              NOT LIKE '%CREATE%PROC%'+ object_name(id) + ' %'
    AND
    (REPLACE(REPLACE(TEXT,CHAR(13),' '),CHAR(10),' ')
              NOT LIKE '%CREATE%PROC%'+ object_name(id) + ']%')
    

    SYS.SQL_MODULES 如果您在 CREATE PROC 比特。

    一个比自己解析文本更健壮的解决方案是生成一个脚本来运行以重新编译所有存储过程。如果你运行下面的…

    SELECT 'EXEC sp_refreshsqlmodule ''' + 
                quotename(schema_name(schema_id)) + '.' + 
                quotename(object_name(object_id)) + '''' 
    FROM sys.procedures
    

    …然后将结果复制并粘贴到Management Studio查询窗口中,并执行结果脚本。对于名称不同步的情况,它会给您一个错误。

    这将导致重新编译所有存储过程计划,因此如果这是一个问题,请不要在生产服务器上执行此操作。

    编辑以提供有关Bug的其他信息。

    如果有任何可能 sp_rename 已用于交换两个对象的定义。 sp_refreshsqlmodule apparently has a bug in that situation!