Solved

Best way to use a procedure/function in mssql server when you have to insert and return a row

Posted on 2015-02-04
5
55 Views
Last Modified: 2015-03-17
Hi,

I am primarily a Java developer with some level of oracle DB experience. I am having to use MSSQL server 2008 R2 for one project. I took a quick tutorial of mssql server on udemy and started creating functions and procedures.

The problem is,

a)   i need to pass a few values to a procedure or a function and insert them in a table and return.

i have read online that functions cannot be used for inserting into existing tables .. rather they only insert into temp tables.. is this true ? can you not insert into a table and return the row inserted in a function on MSSQL server? I used the below procedure anyways.

USE [KingsBayY]
GO
/****** Object:  UserDefinedFunction [dbo].[test_fn_transaction_search]    Script Date: 01/30/2015 11:57:44 ******/
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

Open in new window




b)  in the above procedure, i need to return the row just inserted. how can i do this? or atleast get a return code?

c) is this even the best way of writing this procedure for the requirement? can functions be used ?
0
Comment
Question by:solarisinfosys
5 Comments
 
LVL 10

Expert Comment

by:HuaMinChen
ID: 40590309
Hi,
You can use SP to do insert. Here is one example.

IF ( OBJECT_ID('dbo.sp_Students_INS_byPK') IS NOT NULL ) 
   DROP PROCEDURE dbo.sp_Students_INS_byPK
GO

CREATE PROCEDURE dbo.sp_Students_INS_byPK
       @student_id                     INT                      , 
       @password                       VARCHAR(15)      = NULL  , 
       @active_flg                     TINYINT                  , 
       @lastname                       VARCHAR(30)      = NULL  , 
       @birth_dttm                     DATETIME         = NULL  , 
       @gpa                            INT              = NULL  , 
       @is_on_staff                    TINYINT                   
AS 
BEGIN 
     SET NOCOUNT ON 

     INSERT INTO dbo.Students
          ( 
            student_id                   ,
            password                     ,
            active_flg                   ,
            lastname                     ,
            birth_dttm                   ,
            gpa                          ,
            is_on_staff                  
          ) 
     VALUES 
          ( 
            @student_id                   ,
            @password                     ,
            @active_flg                   ,
            @lastname                     ,
            @birth_dttm                   ,
            @gpa                          ,
            @is_on_staff                  
          ) 

END 

GO

Open in new window

0
 

Author Comment

by:solarisinfosys
ID: 40590318
how is the above answer different from the procedure i wrote? it does not return anything.
0
 
LVL 10

Expert Comment

by:HuaMinChen
ID: 40590328
Use Output parameter like
CREATE PROCEDURE Myproc

@parm varchar(10),
**@parm1OUT varchar(30) OUTPUT**,
**@parm2OUT varchar(30) OUTPUT**
AS
  SELECT @parm1OUT='parm 1' + @parm
 SELECT @parm2OUT='parm 2' + @parm

GO

DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @parmIN VARCHAR(10)
DECLARE @parmRET1 VARCHAR(30)
DECLARE @parmRET2 VARCHAR(30)

SET @parmIN=' returned'
SET @SQLString=N'EXEC Myproc @parm,
                         @parm1OUT OUTPUT, @parm2OUT OUTPUT'
SET @ParmDefinition=N'@parm varchar(10),
                  @parm1OUT varchar(30) OUTPUT,
                  @parm2OUT varchar(30) OUTPUT'

EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@parm=@parmIN,
@parm1OUT=@parmRET1 OUTPUT,@parm2OUT=@parmRET2 OUTPUT

SELECT @parmRET1 AS "parameter 1", @parmRET2 AS "parameter 2"
GO
DROP PROCEDURE Myproc

Open in new window

0
 
LVL 65

Assisted Solution

by:Jim Horn
Jim Horn earned 250 total points
ID: 40590329
If there's an identity field that's created, and only one row is being returned, then yes you can get that value returned ...
INSERT INTO TableA (one, two, three) 
VALUES ('A', 'B', 'C') 

SELECT SCOPE_IDENTITY() as return_id_value

Open in new window


If you're inserting a set, explain in more details what you're trying to do.

Otherwise, cleaning up your code a little...
USE [KingsBayY]
GO
					
CREATE PROC 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
   GETDATE(), tr.CashierID, @amount, @stdt, @enddt,
   c.ID, tr.ReceiptNumber, tr.Voided, it.ItemLookupCode, tr.Comment
FROM Transaction tr, 
   JOIN TransactionEntry trent ON trent.TransactionID = tr.ID  
   JOIN Item it ON trent.ItemID = it.ID
   JOIN Customer c ON c.ID=tr.CustomerID
WHERE tr.ReceiptNumber=@receipt

SELECT SCOPE_IDENTITY() as return_value 
GO

Open in new window

0
 
LVL 24

Accepted Solution

by:
DBAduck - Ben Miller earned 250 total points
ID: 40592336
You can simply use the OUTPUT clause.

Try this out, sorry if I got the tables and columns wrong (ID), but the OUTPUT clause is what you need.

DECLARE @IDs TABLE (ID int NOT NULL PRIMARY KEY)

INSERT INTO [TransactionLog] ( TimeStamp, CashierID, Total,RecurringStartDate, 
RecurringStopDate, CustomerID, ReceiptNumber, Voided, Attendee, ItemLookupCode)
OUTPUT inserted.ID INTO @IDs
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

SELECT ID,
	TimeStamp, CashierID, Total,RecurringStartDate, 
	RecurringStopDate, CustomerID, ReceiptNumber, Voided, Attendee, ItemLookupCode
FROM dbo.[Transaction] tr
INNER JOIN @IDs I ON tr.ID = I.ID

Open in new window

0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
insert into table 8 22
Attaching Database Failed ? 3 39
2016 SQL Licensing 7 40
SQL Syntax: How to force case sensitive query? 2 23
Having an SQL database can be a big investment for a small company. Hardware, setup and of course, the price of software all add up to a big bill that some companies may not be able to absorb.  Luckily, there is a free version SQL Express, but does …
Introduction SQL Server Integration Services can read XML files, that’s known by every BI developer.  (If you didn’t, don’t worry, I’m aiming this article at newcomers as well.) But how far can you go?  When does the XML Source component become …
Via a live example combined with referencing Books Online, show some of the information that can be extracted from the Catalog Views in SQL Server.
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.

786 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question