AlexPonnath
asked on
MSSQL 2014 Returning GUID on Insert via Stored Procedure
I was wondering what i need to do to get the just inserted GUID from a new Record.
My table has a guid column which has a default value of NewID() . Below is my stored
Procedure. If i can insert just fine but dont get the GUID back
My table has a guid column which has a default value of NewID() . Below is my stored
Procedure. If i can insert just fine but dont get the GUID back
CREATE PROCEDURE tbl_Address_INS
(
@Guid uniqueidentifier OUTPUT,
@Version smallint,
@CustomerId varchar(15),
@CustomerName nchar(32),
@CreatedOn datetime,
@CreatedBy nchar(10)
)
AS
INSERT INTO dbo.tbl_Address (
Version,
CustomerId,
CustomerName,
CreatedOn,
CreatedBy)
VALUES
(
@Version,
@CustomerId,
@CustomerName,
@CreatedOn,
@CreatedBy
)
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
So based on your code it seems you are creating a temp table @op and then query @op to get the value ? Is there no way to directly return the inserted.ColGuid
Not realy - is either you declare a variable uniqueidentifier and SET that = NEWID() then insert the value from it then return it at the end OR like in example above that can deal with multiple INSERTed rows in one command.
There are some options where people used triggers(yak!) to PRINT the inserted value but I would never add a trigger on any table (in particular dealing with GUIDS - slowest Microsoft data type - well other than NTEXT) to slow down the insert.
There are some options where people used triggers(yak!) to PRINT the inserted value but I would never add a trigger on any table (in particular dealing with GUIDS - slowest Microsoft data type - well other than NTEXT) to slow down the insert.
ASKER
Only problem is how to access the returned guid from a vb.net ExecuteNonQuery since it doesn't return
any queryResult only Output Parm
any queryResult only Output Parm
if you want to read the value from a .Net client. you would just use the ExecuteScalar method something like:
...
string sql = "INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)";
SqlCommand cmd = new SqlCommand(sql, conn);
Guid guid = (Guid)cmd.ExecuteScalar();
...
...
string sql = "INSERT INTO GuidTest(IntColumn) OUTPUT inserted.GuidColumn VALUES(1)";
SqlCommand cmd = new SqlCommand(sql, conn);
Guid guid = (Guid)cmd.ExecuteScalar();
...
OR... you can fill a SqlDataReader to store the GUIDs and use it from there right?
You can use OUTPUT to return a result set from the stored proc (rather than as an OUTPUT parameter):
CREATE PROCEDURE tbl_Address_INS
(
@Guid uniqueidentifier OUTPUT,
@Version smallint,
@CustomerId varchar(15),
@CustomerName nchar(32),
@CreatedOn datetime,
@CreatedBy nchar(10)
)
AS
INSERT INTO dbo.tbl_Address (
Version,
CustomerId,
CustomerName,
CreatedOn,
CreatedBy)
OUTPUT INSERTED.guid
VALUES
(
@Version,
@CustomerId,
@CustomerName,
@CreatedOn,
@CreatedBy
)
CREATE PROCEDURE tbl_Address_INS
(
@Guid uniqueidentifier OUTPUT,
@Version smallint,
@CustomerId varchar(15),
@CustomerName nchar(32),
@CreatedOn datetime,
@CreatedBy nchar(10)
)
AS
INSERT INTO dbo.tbl_Address (
Version,
CustomerId,
CustomerName,
CreatedOn,
CreatedBy)
OUTPUT INSERTED.guid
VALUES
(
@Version,
@CustomerId,
@CustomerName,
@CreatedOn,
@CreatedBy
)
so you will add the command below after your insert but which column name is the actual GUID as I can't see CustomerId varchar(15) holding GUID data.
......
OUTPUT inserted.Guid
......