我正在通过SSMS在SQL Server中创建存储过程。
我已经编写了下面的存储过程,但是当我点击执行时,会出现错误:
Msg 208,Level 16,State 6,Procedure NewQuestion,Line 11 无效的对象名称'hgomez.NewQuestion'。
表是所有权是否正确。 (hgomez.Questions)
USE [devworks_oscar]
GO
/****** Object: StoredProcedure [hgomez].[NewQuestion] Script Date: 10/23/2011 23:55:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [hgomez].[NewQuestion]
(
@QUESTIONNAME nvarchar(50),
@QUESTION_ID int OUTPUT
)
AS
/* SET NOCOUNT ON */
INSERT INTO [Questions] (QuestionText) VALUES (@QUESTIONNAME)
SET @QUESTION_ID = SCOPE_IDENTITY();
RETURN
提前致谢
答案 0 :(得分:14)
我很喜欢总是在我的CREATE
语句前面加上明确的存在检查,如果找到则删除。
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'NewQuestion' AND ROUTINE_SCHEMA = 'hgomez')
BEGIN
DROP PROCEDURE hgomez.NewQuestion
END
GO
-- this is always a CREATE
CREATE PROCEDURE [hgomez].[NewQuestion]
(
@QUESTIONNAME nvarchar(50),
@QUESTION_ID int OUTPUT
)
AS
/* SET NOCOUNT ON */
INSERT INTO [Questions] (QuestionText) VALUES (@QUESTIONNAME)
SET @QUESTION_ID = SCOPE_IDENTITY();
RETURN
关于权限可能会有点麻烦,所以其他人使用的方法是只创建一个存根方法,直接ALTER
。
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'NewQuestion' AND ROUTINE_SCHEMA = 'hgomez')
BEGIN
EXEC ('CREATE PROCEDURE hgomez.NewQuestion AS SELECT ''stub version, to be replaced''')
END
GO
-- This is always ALTER
ALTER PROCEDURE [hgomez].[NewQuestion]
(
@QUESTIONNAME nvarchar(50),
@QUESTION_ID int OUTPUT
)
AS
/* SET NOCOUNT ON */
INSERT INTO [Questions] (QuestionText) VALUES (@QUESTIONNAME)
SET @QUESTION_ID = SCOPE_IDENTITY();
RETURN
答案 1 :(得分:5)
此脚本尝试修改已存在的过程;它没有创建程序。
要创建程序,请使用CREATE PROCEDURE
CREATE PROCEDURE [hgomez].[NewQuestion]
程序存在后,您可以使用ALTER PROCEDURE
ALTER PROCEDURE [hgomez].[NewQuestion]
答案 2 :(得分:0)
此解决方案https://stackoverflow.com/a/26775310/2211788解释了
如果删除并重新创建存储过程,则会获得一个新的objectid - SSMS中的存储过程列表链接到列表生成时它知道的id。如果您重新创建它但不刷新存储过程文件夹,则任何编辑它的尝试都将指示找不到该过程,因为ID已更改。
答案 3 :(得分:0)
当我打开了两个SSMS实例并且正在处理我第一次打开的实例时,这发生在我身上。将它们都关闭,然后重新打开,效果很好。