如何在SQL Developer中执行SQL Server存储过程?

171

我被授予了访问一个只有执行存储过程的权限的 SQL Server 数据库的用户帐户。我将 JTDS SQL Server JDBC jar 文件添加到了 SQL Developer 并将其添加为第三方 JDBC 驱动程序。我可以成功地登录到 SQL Server 数据库。我已经获得了运行该存储过程的语法:

EXEC proc_name 'paramValue1' 'paramValue2'

当我将其作为语句或脚本运行时,会出现以下错误:

Error starting at line 1 in command:
EXEC proc_name 'paramValue1' 'paramValue2'
Error report:
Incorrect syntax near the keyword 'BEGIN'.

我尝试使用BEGIN / END将语句包装起来,但是收到了相同的错误。 是否可以从SQL Developer中调用该过程?如果可以,我需要使用什么语法?

12个回答

262

您不需要使用 EXEC 子句。只需使用

proc_name paramValue1, paramValue2
(如Misnomer所提到的,你需要逗号。)

5
在我的情况下,需要使用EXEC prior proc_name。意思是需要在执行之前加上该语句。 - César León

85
您缺少逗号。
EXEC proc_name 'paramValue1','paramValue2'

1
我添加了缺失的逗号,但是仍然得到相同的错误。 - sdoca
如果你的参数是varchar类型,那么只需要加引号...除此之外我想不到其他了...你可以尝试在新窗口中仅运行EXEC proc_name,看看它是否会要求你输入第二个参数...这样至少你就知道你的语法是正确的...如果不起作用,那么很可能是你没有正确的存储过程名称...尝试使用完全限定名称。 - Vishal
我删除了第二个参数,但仍然出现相同的错误。我不认为它在运行过程中。EXEC命令没有语法高亮显示,所以我猜开发人员并没有识别它,尽管连接是到SQL Server数据库。但我找不到任何关于这一点的确认/否认信息。 - sdoca
是的..尝试选择一些记录并执行一些简单的命令,看看是否有任何进展!祝你好运。 - Vishal
很遗憾,我的用户只有运行存储过程的权限。 - sdoca

24

你需要这样做:

exec procName 
@parameter_1_Name = 'parameter_1_Value', 
@parameter_2_name = 'parameter_2_value',
@parameter_z_name = 'parameter_z_value'

4
EXECUTE [or EXEC] procedure_name
@parameter_1_Name = 'parameter_1_Value', 
@parameter_2_name = 'parameter_2_value',
@parameter_z_name = 'parameter_z_value'

1

我知道这是旧的版本,但这可能会对其他人有所帮助。

我在BEGIN/END之间添加了SP调用函数。以下是一个可行的脚本。

ALTER Proc [dbo].[DepartmentAddOrEdit]
@Id int,
@Code varchar(100),
@Name varchar(100),
@IsActive bit ,
@LocationId int,
@CreatedBy int,
@UpdatedBy int
AS
    IF(@Id = 0)

    BEGIN
    INSERT INTO Department (Code,Name,IsActive,LocationId,CreatedBy,UpdatedBy,CreatedAt)
        VALUES(@Code,@Name,@IsActive,@LocationId,@CreatedBy,@UpdatedBy,CURRENT_TIMESTAMP)

    EXEC dbo.LogAdd @CreatedBy,'DEPARTMENT',@Name
    END

    ELSE

    UPDATE Department SET
        Code = @Code,
        Name = @Name,
        IsActive = @IsActive,
        LocationId = @LocationId,
        CreatedBy = @CreatedBy,
        UpdatedBy = @UpdatedBy,
        UpdatedAt =  CURRENT_TIMESTAMP 
    where Id = @Id 

1
你需要在paramValue1和paramValue2之间添加一个,,你遗漏了它。
EXEC proc_name 'paramValue1','paramValue2'

0
EXEC proc_name @paramValue1 = 0, @paramValue2 = 'some text';
GO

如果存储过程的目标是对一个已声明了Identity字段的表执行INSERT操作,那么在这种情况下,该字段(在本例中为@paramValue1)应该被声明并传递值0,因为它将自动递增。

0
--worked for me in sql 5.731
--use db;
call procedureName;

-1

我们可以通过两种方式调用存储过程

  1. CALL 数据库名称'。'存储过程名称(参数值); 例如:- CALL dbs_nexopay_sisd1_dec_23.spr_v2_invoice_details_for_invoice_receipt_sub_swiss(1, 1, 1, 1);

  2. 您也可以通过MySQL Workbench进行操作。 i.右键单击存储过程。 ii.发送到SQL编辑器 iii.调用存储过程。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

-3
如果您只需要执行存储过程:proc_name 'paramValue1' , 'paramValue2'...,同时又要执行多个查询,例如一个SELECT查询和一个存储过程,那么您必须添加以下代码:select * from tableName EXEC proc_name paramValue1 , paramValue2...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接