How to get stored procedure internal Declare Variable value in SQL Server - sql

This is my stored procedure:
CREATE PROCEDURE MYSP
(#PARAM INT,
#PARAM2 NVARCHAR(34),
#OUTPARAM3 NVARCHAR(34) OUTPUT)
AS
BEGIN
DECLARE #RParam INT
DECLARE #ErrParam2 NVARCHAR(34)
IF(#PARAM = 1 AND #PARAM2 = 'abc' )
BEGIN
SET #OUTPARAM3 = 'EQUAL'
SET #RPARAM = 0
END
ELSE
BEGIN
SET #ERRPARAM2 = 'SOME ERROR..MSG'
SET #RPARAM = -1
END
RETURN #RPARAM
END
And I am trying to get the value of the internally declare variable value.
DECLARE #RParam INT
DECLARE #ErrParam2 NVARCHAR(34)
#RParam is returned but how can I return #ErrParam2 value?
Declare #RP int
Declare #ErrMsg Nvarchar(40)
Exec #RP = MYSP 1,'abc'

You need to specify the output parameter both when the stored procedure is defined and when it is called:
Declare #RP int;
Declare #ErrMsg Nvarchar(40);
Exec #RP = MYSP 1, 'abc' , #ErrMsg output;

Related

SQL Server output param truncated where it is too long

I have 4 stored procedures.
The following is used to be invoked by C#:
ALTER PROCEDURE [dbo].[sp_retrieveResourceShell]
AS
BEGIN
SET NOCOUNT ON
DECLARE #result NVARCHAR(MAX)
EXEC [dbo].[sp_retrieveResTree]
#pid = NULL,
#ret = #result OUTPUT
***select*** #result
END
These are internal stored procedures:
ALTER PROCEDURE [dbo].[sp_retrieveResTree]
(#pid UNIQUEIDENTIFIER,
#ret NVARCHAR(MAX) OUTPUT)
AS
BEGIN
DECLARE #mdlId UNIQUEIDENTIFIER,
#mdlGroup NVARCHAR(MAX)
DECLARE mdlCursor CURSOR FOR
......
DECLARE #subRet NVARCHAR(MAX),
#viewRet NVARCHAR(MAX)
EXEC [dbo].[sp_retrieveResTree]
#pid = #mdlId,
#ret = #subRet OUTPUT
EXEC dbo.sp_retrieveResView
#mdlId = #mdlId,
#ret = #viewRet OUTPUT
SET #mdlGroup = #mdlGroup + FORMATMESSAGE('{"Id":"%s","Name":"%s","Subs":%s,"Views":%s},'...)
.......
SET #ret = FORMATMESSAGE('[%s]',#mdlGroup)
END
ALTER PROCEDURE [dbo].[sp_retrieveResView]
(#mdlId UNIQUEIDENTIFIER,
#ret NVARCHAR(MAX) OUTPUT)
AS
BEGIN
SET #ret = FORMATMESSAGE('[%s]',#viewGroup)
END
When I invoke sp_retrieveResourceShell like this:
DECLARE #return_value int
EXEC #return_value = [dbo].[sp_retrieveResourceShell]
SELECT 'Return Value' = #return_value
I can get a truncated string with ellipsis at the string tail.
how to get the full string without ellipsis?
update
Changed formatmessage function to string concatenation likes
SET #mdlGroup = #mdlGroup + '{"Id":"' + CAST(#mdlId AS CHAR(36))+ '","Name":"' + #mdlName + '","Subs":' + #subRet + ',"Views":' + #viewRet +'},'
when using string concatenation , likes
SET #ret = N'[' + #mdlGroup + N']'
and refernce to [n]varchar(max) + [n]varchar(max)
i got the right full string . Thanks to #MartinSmith at the same time .

How to return the output of stored procedure into a string variable in SQL Server

I want to execute a stored procedure in SQL Server and assign the output to a string.
CREATE PROCEDURE sp_Check_User_Password
#name NVARCHAR(30),
#email NVARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE #pass NVARCHAR(50)
IF EXISTS(SELECT dbo.Mitarbeiter.Name, dbo.Mitarbeiter.Email
FROM dbo.Mitarbeiter
WHERE dbo.Mitarbeiter.Name = #name
AND dbo.Mitarbeiter.Email = #email
BEGIN
SET #pass = dbo.Mitarbeiter.Password
END
ELSE
BEGIN
SET #pass = null
END
RETURN #pass
END
I have changed what I wrote wrong
Have a look on below sample, just add your stuff and it will work
CREATE PROCEDURE return_string
(#param1 NVARCHAR(10),
#param2 NVARCHAR(10),
#output NVARCHAR(10) OUT)
AS
BEGIN
IF (1=1)
SET #output = 'here'
else
SET #output = null
END
to test
declare #out nvarchar(10)
exec return_string 'firdt param', 'second param', #out out
select #out
I hope this will help you achive what you need.
So your SP would look like:
CREATE PROCEDURE sp_Check_User_Password
(
#name nvarchar(30),
#email nvarchar(50),
#pass nvarchar(50) OUT
)
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT 1
FROM dbo.Mitarbeiter
WHERE dbo.Mitarbeiter.Name = #name
and dbo.Mitarbeiter.Email = #email)
BEGIN
SET #pass = (SELECT dbo.Mitarbeiter.Name
FROM dbo.Mitarbeiter
WHERE dbo.Mitarbeiter.Name = #name
and dbo.Mitarbeiter.Email = #email)
END
ELSE
BEGIN
SET #pass = null
END
END
I'll take a stab at it. Is this what you're trying to do?
CREATE PROCEDURE sp_Check_User_Password
#name nvarchar(30),
#email nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE #pass nvarchar(50) = null
IF EXISTS(SELECT dbo.Mitarbeiter.Email FROM dbo.Mitarbeiter
WHERE dbo.Mitarbeiter.Name = #name and dbo.Mitarbeiter.Email = #email)
BEGIN
SELECT #pass = dbo.Mitarbeiter.Email FROM dbo.Mitarbeiter
WHERE dbo.Mitarbeiter.Name = #name and dbo.Mitarbeiter.Email = #email
END
PRINT #pass
END

Problems with ROLLBACK TRANSACTION inside try/catch

I'm having this error when I try to execute this code:
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1.
I know the problem is on the sp [dbo].[QueueInsert], the sp has an error and it goes directly to the catch. It's funny because the first one (EXEC [dbo].[BacthInsert]) is inserting a summary record and after running the sp, I see the record, so is doing a commit and not doing a rollback. What's wrong with this code? thanks!
CREATE PROCEDURE [cnfg].[SendEmail]
(
,#Employees [dbo].[Employees] readonly
,#ApplicationName NVARCHAR(256)
,#ErrorMsg NVARCHAR(300) = NULL OUTPUT
)
AS
BEGIN
DECLARE #ReturnVal INT
DECLARE #ApplicationId UNIQUEIDENTIFIER
DECLARE #NewIdBatch INT
DECLARE #ID INT
DECLARE #EmployeeId INT
DECLARE #Index INT = 1
DECLARE #Total INT
SET NOCOUNT ON;
SET XACT_ABORT ON;
SET #ReturnVal = 0;
SET #ErrorMsg = '';
SET #ApplicationId = [GetId](#ApplicationName);
IF (#ApplicationId IS NULL)
BEGIN
SET #ReturnVal = 1;
SET #ErrorMsg = 'The Application Name does not exist in the database';
Goto ProcedureExit
END
----------------------------------------------------------
BEGIN TRY -- Start Main TRY
----------------------------------------------------------
BEGIN TRANSACTION;
EXEC [dbo].[BacthInsert]
#ParameterId = 1
,#ID = #NewSendEmailBatchId OUTPUT
,#ErrorMsg = #ErrorMsg OUTPUT
IF ( #ErrorMsg <> '' )
BEGIN
SET #ReturnVal = 1;
SET #ErrorMsg = 'There was an error trying to insert data into [dbo].[BacthInsert] table';
RAISERROR(#ErrorMsg, 16, 1)
END
SELECT ROW_NUMBER() OVER ( ORDER BY EmployeeId ) Row,
EmployeeId
INTO #EmpIds
FROM #Employees
SELECT #Total = COUNT(*) FROM #EmpIds
WHILE ( #Index <= #Total )
BEGIN
SELECT #EmployeeId=EmployeeId FROM #EmpIds WHERE Row = #Index
EXEC [dbo].[QueueInsert]
#SendEmailBatchId = #NewIdBatch
,#ID = #ID OUTPUT
,#ErrorMsg = #ErrorMsg OUTPUT
IF ( #ErrorMsg <> '' )
BEGIN
SET #ReturnVal = 1;
SET #ErrorMsg = 'There was an error trying to insert data into [dbo].[QueueInsert] table';
RAISERROR(#ErrorMsg, 16, 1)
END
SET #Index+=1;
END
COMMIT TRANSACTION;
----------------------------------------------------------
END TRY -- End Main TRY
----------------------------------------------------------
----------------------------------------------------------
BEGIN CATCH -- Start Main CATCH
----------------------------------------------------------
SELECT ERROR_MESSAGE()
IF (XACT_STATE()) = -1
BEGIN
ROLLBACK TRANSACTION;
END;
----------------------------------------------------------
END CATCH -- End Main CATCH
----------------------------------------------------------
ProcedureExit:
RETURN #ReturnVal;
END

sql server The multi-part identifier " " could not be bound stored procedure

I create a stored procedure in which I call two functions .
I'm getting an error:
Msg 4104, Level 16, State 1, Procedure Add_Translation, Line 25
The multi-part identifier ".word" could not be bound.
This is my stored procedure:
ALTER PROCEDURE [dbo].[Add_Translation]
#english nvarchar(70),
#kurdish nvarchar(70),
#english_category int,
#kurdish_category int,
#result int out
AS
BEGIN
SET NOCOUNT ON;
if #english is not null and #kurdish is not null and #english_category is not null and #kurdish_category is not null
begin
declare #intEnId int=-1;
exec #intEnId = Check_English_word #text = #english;
declare #identityEnglish int;
declare #identityKurdish int;
if #intEnId = -1
begin
insert into english_table values(#english, #english_category);
set #identityEnglish = SCOPE_IDENTITY();
end
else
begin
set #identityEnglish = (select e.english_id from english_table e where UPPER(.word)=UPPER(#english));
end
declare #intKuId int=-1;
exec #intKuId=Check_Kurdish_Word #word=#kurdish;
if #intKuId =-1
begin
insert into kurdish_table values(#kurdish, #kurdish_category);
set #identityKurdish = SCOPE_IDENTITY();
end
else
begin
set #identityKurdish = (select k.kurdish_id from kurdish_table k where upper(k.word)=upper(#kurdish));
end
declare #translated int =0;
exec #translated = Check_Translation #english_id = #identityEnglish, #kurdish_id = #identityKurdish;
if #translated=0
begin
insert into transactions values(#identityEnglish, #identityKurdish);
set #result = 1;
end
else
begin
set #result = 2;
end
end
else
begin
set #result = 0;
end
END
Here is the first function:
ALTER FUNCTION [dbo].[Check_English_word]
(
#text nvarchar(70)
)
RETURNS int
AS
BEGIN
DECLARE #Result int
set #Result=-1;
if #text is not null
begin
SELECT #Result = e.english_id
from english_table e
where UPPER(e.word) = UPPER(#text);
end
RETURN #Result
END
Second function:
ALTER FUNCTION [dbo].[Check_Kurdish_Word]
(
#word nvarchar(70)
)
RETURNS int
AS
BEGIN
DECLARE #Result int
set #Result=-1;
if #word is not null
begin
SELECT #Result = k.kurdish_id
from kurdish_table k
where UPPER(k.word) = UPPER(#word);
end
RETURN #Result
END
You are missing an e in this line
set #identityEnglish=(select e.english_id from english_table e
where UPPER(.word)=UPPER(#english));
Change it to
set #identityEnglish=(select e.english_id from english_table e
where UPPER(e.word)=UPPER(#english));
Also, it is good practice to specify columns when doing an insert -
ie
insert into english_table values(#english,#englsih_category);
should be
insert into english_table (word, category) values(#english,#englsih_category);

Stored Procedure Fill Variable with a ResultSet of a Query

I have a little Problem but don't know the Solution!
I have wrote a Stored Procedure. The function of this isn't necessary.
I want to declare a Variable from Type int.
This Variable must get the Value of a SQL Query.
My attempt:
DECLARE #ParentServiceProviderId int = null
SET #ParentServiceProviderId = (SELECT ParentServiceProviderId
FROM ServiceProvider
WHERE ServiceProviderId = #ServiceProviderId)
It didn't work! The ResultSet of the Query have one Row every Time!
I don't know how to solve this Problem!
Here is the complete Stored Procedure:
ALTER PROCEDURE [dbo].[InsertCarmakerPartnership_ChildToParent]
#ServiceProviderId int,
#CarmakerId int,
#ValidFrom datetime,
#ValidTo datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE #parentSPPId int, #parentSPPParentId int, #superParentId int, #ParentServiceProviderId int = null
SET #ParentServiceProviderId = (SELECT ParentServiceProviderId
FROM ServiceProvider
WHERE ServiceProviderId = #ServiceProviderId)
DECLARE ServiceProviderParent_Cursor CURSOR FOR
SELECT ServiceProviderId, ParentServiceProviderId
FROM ServiceProvider
WHERE ServiceProviderId = #ParentServiceProviderId
OPEN ServiceProviderParent_Cursor;
FETCH NEXT FROM ServiceProviderParent_Cursor INTO #parentSPPId, #parentSPPParentId
IF (#ParentServiceProviderId is NULL)
BEGIN
SET #superParentId = #ServiceProviderId
EXEC InsertCarmakerPartnership_ParentToChild #superParentId, #CarmakerId, #ValidFrom, #ValidTo;
END
WHILE ##FETCH_STATUS = 0
BEGIN
IF #ServiceProviderId > 0
BEGIN
EXEC InsertCarmakerPartnership_ChildToParent #parentSPPId, #CarmakerId, #parentSPPParentId, #ValidFrom, #ValidTo ;
IF (SELECT COUNT(*) FROM dbo.CarmakerPartnership WHERE ServiceProviderId = #parentSPPId AND CarmakerId = #CarmakerId AND IsDeleted = 0) = 0
BEGIN
INSERT INTO dbo.CarmakerPartnership (CarmakerId, ServiceProviderId, CreatedBy, ChangedBy, ValidityPeriodFrom, ValidityPeriodTo) VALUES (#CarmakerId, #parentSPPId, SYSTEM_USER, SYSTEM_USER, #ValidFrom, #ValidTo)
END
END
FETCH NEXT FROM ServiceProviderParent_Cursor INTO #parentSPPId, #parentSPPParentId
END;
CLOSE ServiceProviderParent_Cursor;
DEALLOCATE ServiceProviderParent_Cursor;
END
Thanks for your help and sorry for my bad english!
Best regards.
Anyway, use next code to populate a variable:
DECLARE #ParentServiceProviderId int
SELECT #ParentServiceProviderId = ParentServiceProviderId
FROM ServiceProvider
WHERE ServiceProviderId = #ServiceProviderId
do not assign default value to this variable and the rest of the code is:
DECLARE #ParentServiceProviderId int
SELECT #ParentServiceProviderId = ParentServiceProviderId
FROM ServiceProvider
WHERE ServiceProviderId = #ServiceProviderId