我主要是一名具有某种级别的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)这是否是为此要求编写此程序的最佳方式?可以使用功能吗?
答案 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
中函数和过程差异摘要的好文章