MSSQL过程插入行并返回插入的行/返回值...调用时抛出异常

时间:2015-02-05 04:15:48

标签: java sql-server sql-server-2008 stored-procedures

我主要是一名具有某种级别的Oracle数据库经验的Java开发人员。我不得不将MSSQL server 2008 R2用于一个项目。我在udemy上快速学习了mssql server,并开始创建函数和程序。

问题是三折,

a)我需要将一些值传递给过程或函数,然后将它们插入表中并返回。

我在网上看过,函数不能用于插入到现有表中..而是只插入临时表..这是真的吗?你不能插入表并返回插入MSSQL服务器上的函数行?无论如何,我使用了以下程序。

USE [KingsBayY]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

alter PROCEDURE test_fn_transaction_insert_log @receipt varchar(25), @amount varchar(25), @stdt varchar(25), 
@enddt varchar(25)

AS

SET NOCOUNT ON

INSERT INTO [TransactionLog] ( TimeStamp, CashierID, Total,RecurringStartDate, 
RecurringStopDate, CustomerID, ReceiptNumber, Voided, Attendee, ItemLookupCode)
SELECT  CURRENT_TIMESTAMP AS [TimeStamp], tr.CashierID, @amount, @stdt,@enddt,c.ID,tr.ReceiptNumber,
tr.Voided,it.ItemLookupCode, tr.Comment
from [Transaction] tr, TransactionEntry trent, Item it, Customer c
     where trent.TransactionID = tr.ID
     and trent.ItemID = it.ID
     and c.ID=tr.CustomerID
     and tr.ReceiptNumber=@receipt
--condition to ensure no duplicates are entered  and [TransactionLog].ID not in (select ID from [TransactionLog] where [TransactionLog].ID=tr.ID)

GO

截至目前,当我尝试在Java中调用此过程时,它会抛出异常

public String saveTr(String a, String b, String c, String d) {
    try
    {
        SqlServerConn conn = new SqlServerConn();
        connect=conn.getConnection();
        String SQL = String.format("Exec test_fn_transaction_insert_log ?,?,?,?");  
        pstmt = connect.prepareStatement(SQL);
        pstmt.setString(1, a);
        pstmt.setString(2, b);
        pstmt.setString(3, c);
        pstmt.setString(4, d);
        pstmt.executeQuery();
    }
    catch (Exception e2)
    {
        e2.printStackTrace();
        return "fail";
    }
    //ArrayList<Transactions> list=getrowFromResultSet2(rs);

    return "success";
}

我得到了这个例外:

com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.

b)在上面的过程中,我需要返回刚刚插入的行。我怎样才能做到这一点?或者至少得到一个返回代码?

c)这是否是为此要求编写此程序的最佳方式?可以使用功能吗?

1 个答案:

答案 0 :(得分:0)

a)这是正确的,在SQL引用它们的意义上,函数不能用于执行任何数据修改。但是你要找的是一个存储过程。在Java / C#lingo中,存储过程基本上仍然是一个函数,它只是在SQL中根据它是什么或不允许执行它来完成。

b)如果您需要返回的行,则有两个选项。首先,因为您使用的是SQL Server 2008或更新版本,所以可以使用OUTPUT子句。您可以在MSDN上阅读它,但想法是在您的插入和选择之间,您只需在OUTPUT语句中滑动,该语句将获取您当前正在插入的内容,并将其选中。或者,如果您不想使用输出子句,则可以在插入后生成一个select语句,该语句返回与刚刚插入的主键关联的值

c)看到一个。程序是要走的路。

编辑:指向MSDN OUTPUT文档的链接。具体看一下插件的工作原理。

https://msdn.microsoft.com/en-us/library/ms177564.aspx

这是一篇关于SQL

中函数和过程差异摘要的好文章

http://www.dotnet-tricks.com/Tutorial/sqlserver/7EDL150912-Difference-between-Stored-Procedure-and-Function-in-SQL-Server.html