sql server denali ctp3中新增存储过程abc后,能使用EXEC abc,但是abc下有红线,提示找不到存储过程“abc”,将sql server 关闭后重新打开,红线才会消失,请问为什么?该怎么办?
2011-09-28 09:58
提问者采纳
原因是这样的. 你的 SQL Server 客户端, 在连接到 SQL Server 数据库以后。 会自动读取 数据库的 数据字典信息。 也就是 当前数据库, 有哪些表/字段/视图/存储过程 等 基础信息。 保存在客户端的 内存里面。 这样。当你在客户端 输入 SQL 语句的时候, 输入 表名字. 会自动弹出 这个表的 字段列表, 让你选择。 但是, 当你新建了一个对象的时候, 例如表, 或者你的那个例子, 是 新建 存储过程abc 这个时候, 数据库那里, 已经有 存储过程 abc 了。 但是客户端的缓存里面, 并没有 存储过程 abc 的信息。 因为内存里面的信息,没有更新。 因此,在客户端那里。 输入 EXEC abc, abc下有红线。 将 客户端关闭后,重新打开, 由于客户端 重新加载了 数据库的基础信息。 知道了 当前数据库里面, 有 一个名字叫 abc 的存储过程 因此,就不出 红线 了。
-
追问
-
谢谢你的回答 但是我的SQL SERVER 是安装的自己的电脑上的,数据库也存放在C盘的,为什么还要重新加载呢?我在公司用的SQL SERVER新增完了就能直接用了啊。
-
回答
-
SQL Server 的工作方式, 是 客户端 - 服务器 的工作方式. 就算 SQL SERVER 是安装的自己的电脑上的,数据库也存放在C盘 但是你的机器上,实际上是运行了 2 个程序, 一个是 服务器程序, 一个是 客户端程序。 客户端 新建了存储过程, 实际上是 把 SQL 代码, 发送给 服务器程序。 服务器程序 编译代码的有效性,并存储。 假如 编译通过了, 那是可以运行的, 不管你数据库存在本机, 还是存在服务器上面。 至于你本地的那个 红线, 实际上是 客户端的 本地的模拟的 编译。 客户端不管你代码是否正确, 都是 发送给服务器那里去 执行的。 因此你 abc下有红线,提示找不到存储过程“abc” 而 又能使用EXEC abc 这个就是 客户端 认为 服务器上面, 没有 abc 这个存储过程。 但是你执行 EXEC abc 客户端 是只能原样的把这句话, 发给服务器 如果 服务器那里, 真的没有 abc 这个存储过程 那么会返回 服务器的 错误提示。 如果服务器有 abc 这个存储过程 那么就 返回 执行的结果。