我目前正在尝试通过PHP执行存储过程(两个INSERTS和一个SELECT).存储过程有效(不会抛出任何错误).甚至将值插入给定的表中.我们将结果存储在JSON对象中,但它返回一个空数组.当我们执行仅包含SELECT的存储过程时,它返回正确的值.我们的表中已经更改了所有名称(可能已经错过了一些但我们的代码运行).任何人都可以阐明为什么我们的阵列没有填充?
这是我们的存储过程
ALTER procedure
As
BEGIN
INSERT INTO TABLE1
(Loan_ID, Doc_ID, Borrower_Name, Docs_Drawn, Funder, First_Payment, Interest_Rate, Loan_Amount)
Select Loan_ID,
(SELECT (COUNT(*)) FROM TABLE WHERE A.Loan_ID = Loan_ID) AS Doc_ID,
Borrower ,[Date_Docs_Drawn]
,[Funder]
,[Payment_Date]
,[Interest_Rate]
,[Loan_Amount] from VIEW A
INSERT INTO TABLE2
(Loan_ID, Submitted_By, Event_Class, Event_Type, Event_Date, Doc_ID)
SELECT A.[Loan_ID],
'Program' AS Submitted_By
,'Collateral' AS Event_Class
, 'Outstanding' AS Event_Type
, CURRENT_TIMESTAMP AS Event_Date
, Doc_ID
FROM TABLE1 AS A
WHERE NOT (A.Loan_ID = ANY (SELECT Loan_ID FROM TABLE2))
SELECT [Loan_ID],[Doc_ID],[Borrower_Name] …Run Code Online (Sandbox Code Playgroud) 为了在事务中包装存储过程,我添加以下内容:
CREATE PROCEDURE [dbo].[P_ORD_InsertTextField]
//PARAMS
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION
//STP BODY
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
END
GO
Run Code Online (Sandbox Code Playgroud)
有没有更短的方式做同样的事情?这是"只是"处理事务的巨大代码块.
我正在尝试将新记录插入到MS SQL数据库中,并且我得到了一个我以前从未见过的异常.当我调用时executeUpdate抛出以下异常:
com.microsoft.sqlserver.jdbc.SQLServerException: A result set was generated for update.
这是产生错误的Java代码:
// addComment method adds a new comment for a given requestId
public CommentBean addComment(CommentBean comment) {
PreparedStatement stmt = null;
INative nat = null;
Connection conn = null;
try {
nat = dbConn.retrieveNative();
conn = (Connection)nat.getNative("java.sql.Connection");
stmt = conn.prepareStatement(ADD_COMMENT);
stmt.setInt(1, comment.getRequestId());
stmt.setString(2, comment.getComment());
stmt.setString(3, new SimpleDateFormat("MM/dd/yyyy").format(comment.getDateCreated()));
stmt.setString(4, comment.getCreatedBy());
comment.setCommentId(stmt.executeUpdate()); // exception
} catch(Exception ex) {
System.err.println("ProjectRegistration::SQLDAO - addComment");
ex.printStackTrace();
} finally {
try {
if (stmt != …Run Code Online (Sandbox Code Playgroud) 我们正在设计企业应用程序,我们的技术架构师建议"让代码中没有sql查询.即使对数据库进行简单的select调用,也应该在数据库中为它编写存储过程代码应该调用它."
我的问题是,在整个代码中只有存储过程并且没有任何查询似乎是一个愚蠢的想法!我们的家伙对这个想法深信不疑,但我对此表示怀疑......你们有什么话要说?
如果它是一个好主意,我会喜欢它,如果有人能告诉我支持它的原因.
如果这是一个坏主意,请告诉我他们可以提出什么论点来说服他们.
感谢您的帮助.
thx -ksm
我们引入了一个用于调用SQL存储过程的新数据访问框架.当调用返回记录集的存储过程时,我们遇到了存储过程也执行某种更新(插入/更新/删除)的问题:
无法更改具有Command对象作为其源的Recordset对象的ActiveConnection属性.
解决方法是在存储过程的顶部添加"SET NOCOUNT ON".这很好用,当然,它也有一个吹捧性能增强.
我们建议开发人员,当他们想编写代码来调用现有的存储过程时,他们还必须重构存储过程本身以包含SET NOCOUNT ON.
但是,这让我想知道,对包括所有存储过程进行全面更新的潜在后果/风险是什么SET NOCOUNT ON.在什么情况下会破坏SP的功能?(假设即使SET NOCOUNT为ON,@@ ROWCOUNT函数也会更新)
一如既往的帮助,非常感谢.
当语句不返回结果集时,我正在尝试处理SQLServerException。我对Java还是很陌生,因此无法找到解决它的方法。请谁能建议我该如何解决错误?我遇到困难的地方是该存储过程未返回任何结果集,而我想显示“找不到记录”之类的内容。我该如何解决?
stmt = conn.prepareCall("{call p_GetAllowedPublicIPs(?,?,?)}");
Run Code Online (Sandbox Code Playgroud)
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//processRequest(request, response);
PrintWriter out = response.getWriter();
String IsLoginDisabled = null;
String BankID =null;
String publicip=null;
try {
//processRequest(request, response);
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = null;
CallableStatement myStmt = null;
int count =0;
conn = DriverManager.getConnection("jdbc:sqlserver://MPESA\\SQL2012;user=realm;password=friend;database=ElmaTest");
if(conn!=null)
{
out.println("Connection Succcesful");
myStmt = conn.prepareCall("{call sp_GetPortalUser(?,?,?)}");
myStmt.setString("Country", "Kenya");
myStmt.setString("BankName", "CS");
myStmt.setString("UserID", "Frank");
ResultSet rs= myStmt.executeQuery();
while(rs.next())
{
count++;
BankID = rs.getString("BankID");
String employeeid= rs.getString("EmployeeID");
String FirstName = rs.getString("FirstName"); …Run Code Online (Sandbox Code Playgroud) 有没有人知道为什么我不会得到结果集如果我在商店程序中的选择之前做更新.我正在运行MSSQL server 2005和最新的Microsoft JDBC驱动程序.
相关的java代码:
CallableStatement cstmt = con.prepareCall("{call dbo.sp_groups_select}");
if (cstmt.execute()) {
while (cstmt.getResultSet().next())
Run Code Online (Sandbox Code Playgroud)
如果存储过程如下所示,则不会获得结果集:
CREATE PROCEDURE [dbo].[sp_groups_select] AS
update Computers set ComputerName='Foo' where ComputerName='bar';
select * from Computers;
Run Code Online (Sandbox Code Playgroud)
但如果它看起来像这样我得到一个结果集
CREATE PROCEDURE [dbo].[sp_groups_select] AS
select * from Computers;
update Computers set ComputerName='Foo' where ComputerName='bar';
Run Code Online (Sandbox Code Playgroud) 我正在使用JPA 2.0和SQL Server 2008,并且当我使用表变量时,我已经确定JPA不喜欢我的存储过程.
例如,这个sproc工作:
declare @t table
(
id int identity
, test varchar(50)
)
select 'blah' as test -- I'm ignoring the table variable above
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试@t使用此代码将某些内容插入到表变量中时,它会崩溃:
declare @t table
(
id int identity
, test varchar(50)
)
insert into @t
select cast(getdate() as varchar(60))
select * from @t
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
Error Code: 0
Run Code Online (Sandbox Code Playgroud)
如果我可以帮助它,我不想重写我的复杂sprocs而不使用表变量.
谢谢你的任何建议.
我的TRIGGER遇到了一些问题:
CREATE TRIGGER "tblSettingTable_INSERT"
ON dbo.tblSettingTable
FOR INSERT
AS
INSERT INTO dbo.tblSettingReportParameter (tableName, columnName, columnCaption)
SELECT tableName = CAST(OBJECT_NAME(c.object_id) AS varchar(100)),
columnName = CAST(c.name AS varchar(100)),
columnCaption = CAST(ex.value AS varchar(100))
FROM sys.columns c
LEFT OUTER JOIN sys.extended_properties ex
ON ex.major_id = c.object_id
AND ex.minor_id = c.column_id
AND ex.name = 'MS_Caption'
INNER JOIN inserted ON OBJECT_NAME(c.object_id) = inserted.tableName
WHERE OBJECTPROPERTY(c.object_id, 'IsMsShipped')=0
AND OBJECT_NAME(c.object_id) = inserted.tableName
Run Code Online (Sandbox Code Playgroud)
我正在尝试从表中获取一些列属性并将其插入dbo.tblSettingReportParameter但我将其抛向我的脸:"键列信息不足或不正确.更新会影响太多行."
我究竟做错了什么?使用MS-SQL 2008 RS.
谢谢,
斯特凡
我正在使用插入/更新触发器来更新第二个表的列Price.
插入触发器似乎工作得很好,但是当我尝试更改SSMS中的单个记录时,我收到一个错误:
更新或删除的行值不会使行唯一,也不会更改多行(2行).
这是我的更新触发器:
CREATE TRIGGER [dbo].[trgUpdateMasterData] ON [dbo].[tabSparePartMasterData_Temp]
AFTER UPDATE
AS
UPDATE tabSparePart
SET Price = MD.Price
FROM tabSparePart INNER JOIN
(
SELECT inserted.[Material Number (SAP)] AS MaterialNumber, inserted.Price
FROM inserted
GROUP BY [Material Number (SAP)], inserted.Price
) MD
ON tabSparePart.SparePartName = MD.MaterialNumber
Run Code Online (Sandbox Code Playgroud)
我需要按Material-Number分组,因为有多余的行插入到表中tabSparePartMasterData_Temp,我只用于更新Sparepart-Price tabSparePart.但我假设小组将整理重复(任何重复的价格相同).
插入/更新的记录可能MaterialNumber不可用tabSparepart.在这种情况下,应该"跳过"此记录.是否INNER JOIN考虑到了这一点?
我已经为Select Query创建了一个存储过程,它工作正常.但我需要一些更有效的方法来制作我的SP查询.你有什么建议吗?
Create Procedure usp_SelectUserProfile
@UserId int
As
Begin
Select <column name> from DB where UserId = @UserId
End
Run Code Online (Sandbox Code Playgroud)
日Thnx
这是我的代码:
Dim CompanyName, _
CompanyDomain, _
CompanyEmail, _
CompanySupportPhone
Call GetEmailList
Sub GetEmailList
dim sql
dim companydata
sql = ""
sql = sql & " DECLARE @CompanyName VARCHAR(100);"
sql = sql & " DECLARE @CompanyDomain VARCHAR(100);"
sql = sql & " DECLARE @CompanyActivityEmail VARCHAR(100);"
sql = sql & " DECLARE @CompanySupportPhone VARCHAR(100);"
sql = sql & " SELECT"
sql = sql & " @CompanyName = CASE WHEN Setting = 'CompanyName'"
sql = sql & " THEN StringValue ELSE @CompanyName END," …Run Code Online (Sandbox Code Playgroud)