I have a stored procedure where I will have an output parameter. The query works and when I run the query inside SQL Server Management Studio, I get the correct answer. My problem is assigning the answer to my output parameter. Here is the stored procedure:
ALTER PROCEDURE [dbo].[RDusp_Report_Impact]
-- Add the parameters for the stored procedure here
#SiteID int,
#RiskCount int output
AS
BEGIN
SET NOCOUNT ON;
select sum(cnt) as mytotal from
(
select count(Impact.Rating) as cnt from Impact, Likelihood, Exposure where
Impact.SiteID=2
and Exposure.SiteID = 2 and Impact.Rating > 3 and Likelihood.Rating > 3
and Exposure.ImpactID = Impact.ImpactID and exposure.LikelihoodID = Likelihood.LikelihoodID
) as c
END
I try to assign #RiskCount to be the value in mytotal, but it says that the column doesn't exist. I just want to get that one result back. Shouldn't be too difficult, just a syntax thing that I can't get. Thanks.
Modify your query like this (the crucial part is the 1st line of the SELECT statement - select #RiskCount = sum(cnt):
ALTER PROCEDURE [dbo].[RDusp_Report_Impact]
-- Add the parameters for the stored procedure here
#SiteID int,
#RiskCount int output
AS
BEGIN
SET NOCOUNT ON;
select #RiskCount = sum(cnt)
from
( select count(Impact.Rating) as cnt
from Impact, Likelihood, Exposure
where Impact.SiteID=2
and Exposure.SiteID = 2
and Impact.Rating > 3
and Likelihood.Rating > 3
and Exposure.ImpactID = Impact.ImpactID
and exposure.LikelihoodID = Likelihood.LikelihoodID ) as c
END
Execute it like this:
DECLARE #rc int
EXEC [dbo].[RDusp_Report_Impact] 123, #rc output -- 123 is an example #SiteID value
SELECT #rc
Related
I have a table that have a list of "Reports" or "Correspondence Letters" (html files). This list will appear in a dropdown in a website. Some of these items will need a "check" to see if they are allowed to be added to the dropdown.
An example of how this table (I removed columns that was not necessary to display):
In this table there is a column "Cor_PolNeedCheck_ToShow". This value links to a different table where the query for that file is stored.
From here I need to create a query that will build the actual list that will be displayed. But in order to do that I need to run the query that is in the second table to perform the check. I've created the following query to do this and it brings back the expected results:
DECLARE #retvalue INT
DECLARE #Paramater NVARCHAR(20) = '241215'
DECLARE #Cor_GroupCde NVARCHAR(10) = 248
DECLARE #Statement NVARCHAR(500);
SELECT #Statement = (SELECT Lookup_Query + #Paramater FROM [dbo].[Ref_Lookup]
WHERE Lookup_ID = (Select Cor_PolNeedCheck_ToShow FROM dbo.Ref_Correspondence WHERE Cor_Group_Cde = #Cor_GroupCde));
EXEC #retvalue = sp_executesql #Statement;
PRINT #retvalue
This value needs to be passed into a query again to verify each record to show or not to show. This is the query that will run to show the items (I have added the #retvalue of the above in the query just to show what it needs to do). This query is in a stored proc where the #Paramater will be passed (above) from the application and then to be used as needed for the below (as above query needs to fit into this one).
SELECT Cor_Group_Cde, Cor_Desc
FROM Ref_Correspondence
WHERE Cor_Show = 'Y' AND Cor_Prod_List Like '%#' + #ProdID + '#%'
AND (Cor_PolNeedCheck_ToShow IS NULL OR --#retValue > 0)
The problem I'm facing is that I need to get the #retValue into the where clause.
I have though of a stored proc, but a stored proc cannot be called in a where clause. I then though of a user defined function, but the problem there is that you cannot call a stored proc ("sp_executesql") in a function.
Due to company standards I cannot do this within the application either. Is there a way around this or is there a way to do this that I maybe missed with the above?
-------------------- EDIT ---------------------
The function I created looks like this:
USE [DBName]
GO
/****** Object: UserDefinedFunction [dbo].[ufn_CorrespondenceCheckResult] Script Date: 4/11/2019 5:35:04 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[ufn_CorrespondenceCheckResult]
(
#Paramater nvarchar(20),
#Cor_GroupCde nvarchar(10)
)
RETURNS int
AS
BEGIN
DECLARE #Statement nvarchar(MAX);
DECLARE #Return int;
set #Return = 0;
SELECT #Statement = (SELECT Lookup_Query + #Paramater FROM [dbo].[Ref_Lookup]
WHERE Lookup_ID = (Select Cor_PolNeedCheck_ToShow FROM dbo.Ref_Correspondence WHERE Cor_Group_Cde = #Cor_GroupCde));
EXEC #Return = sp_executesql #Statement;
return #Return;
END
Running the above function in my script gives me an error of "Only functions and some extended stored procedures can be executed from within a function.":
SELECT Cor_Group_Cde, Cor_Desc
FROM Ref_Correspondence
WHERE Cor_Show = 'Y' AND Cor_Prod_List Like '%#' + #ProdID + '#%'
AND (Cor_PolNeedCheck_ToShow IS NULL OR ((SELECT [dbo].[ufn_CorrespondenceCheckResult] (#Paramater,#Cor_GroupCde)) > 0))
It would be better to convert your Stored Procedure into a Function, if possible. Then you can use function in WHERE clause.
If you can't convert it into the function then better to execute the SP and store the full result in a Variable. Now you can use This table in WHERE clause.
You should store the result of the Stored Procedure in a variable in then use that in your next statement's condition. You can use an OUTPUT parameter to return the value of from the Stored Procedure.
DECLARE #count INT
EXEC FindProductByModel --CREATE a stored procedure FindProductByModel instead of a function
#Paramater = '241215',
#Cor_GroupCde = '248',
#retvalue= #count OUTPUT --#retval is an output paramater of your stored procedure
SELECT Cor_Group_Cde, Cor_Desc
FROM Ref_Correspondence
WHERE Cor_Show = 'Y' AND Cor_Prod_List Like '%#' + #ProdID + '#%'
AND (Cor_PolNeedCheck_ToShow IS NULL OR #count>0)
create procedure spGetEmployeByDepartmentIdCount
#DepartmentIdType int ,
#DepartmentIdCount int output
as
Begin
select count(id)
from tblemploye1
where #DepartmentIdType = id
End
Declare #DepartmentIdCount int
Declare #id int
set #id = 1
Execute spGetEmployeByDepartmentIdCount #id, #DepartmentIdCount output
print #DepartmentIdCount
Your stored procedure returns only SELECT data
Since you did not assign any value to output parameter, it is NULL
You can change your stored procedure code as follows using ALTER statement
select
#DepartmentIdCount = count(id)
from tblemploye1
where
id = #DepartmentIdType
Now the output parameter is assigned with the count of employees in selected department
I hope it helps
I got SP that gets USER_ID as input and fetches GROUP_ID from the table, but it shows error when I'm trying to run it:
must declare scalar variable #Group_i
My stored procedure:
Alter PROCEDURE [dbo].[DisplayDetails]
#User_Id int,
#Group_Id int OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Begin
-- Insert statements for procedure here
SELECT
#Group_Id=(select distinct(Group_Id) from input_files_updated)
from INPUT_FILES_updated where [User_Id]=#User_Id
END
END
GO
Query to execute SP:
Declare #Group_I int
Execute [dbo].[DisplayDetails] #User_Id='3',
#Group_Id=#Group_I out
Why I'm getting this error?
A little bit fixed query of yours:
Alter PROCEDURE [dbo].[DisplayDetails]
#User_Id int,
#Group_Id int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT #Group_Id = (
select top 1 Group_Id
from INPUT_FILES_updated
where [User_Id]=#User_Id
)
RETURN
END
As I remember there must be a word RETURN in SP. Then try:
Declare #Group_I int
Execute [dbo].[DisplayDetails] #User_Id=3, #Group_Id=#Group_I output
SELECT #Group_I
I have a stored procedure that I cannot change. And it returns a select value (integer).
It insert some values and return the new id - the last line of the stored procedure:
SELECT #newID
I am using the new ID but I don't want to display that value when I run the stored procedure.
So I use the following:
DECLARE #test INT
EXEC #test = Pr_My_Procedure 'NewGroupName'
SELECT #test
This executes successfully, but my variable #test is always = 0 when the actual value created and return for the stored procedure is an actual id number.
Why is my variable is not being assigned?
I have a work around (which is not really what I wanted but it works:
1 DECLARE #NewGroupID INT
2 EXEC Pr_My_Procedure 'NewGroupName'
3 SET #NewGroupID = (SELECT GroupID FROM DB..Groups WHERE GroupName = 'NewGroupName')
This works, but when running the stored procedure, I still get the GroupID generated being return on the results (line 2). I don't want to see that.
Is it possible to NOT return that select result from the procedure?
Thanks all for any advise!
When you do
exec #p = StoredProc
... you are dealing with the return value of the proc, not the result set of the proc. The default return value of a procedure is zero so that if you do not do an explicit RETURN in your procedure, it returns 0.
You can change the procedure to RETURN your ID, or add an output parameter.
-- Procedure which RETURNS the ID
create procedure StoredProc_WithReturn
as
return 10;
go
-- Procedure which uses output parameter instead.
create procedure StoredProc_WithOutput
#p int output
as
select #p = 12;
go
-- Now test both ways of returning a value
declare #p int = 0,
#po int = 0;
exec #p = StoredProc_WithReturn;
select #p;
exec StoredProc_WithOutput #po output;
select #po;
Since you cannot change the procedure, you can insert the result set of the procedure into a table, temporary table or table variable like so
create procedure StoredProc_WithSelect
as
select 10;
go
declare #pt table (a int);
insert #pt
exec StoredProc_WithSelect;
select a from #pt;
If you don't see result, you can use PRINT instead of SELECT. Try this:
DECLARE #test INT
EXEC #test = Pr_My_Procedure 'NewGroupName'
PRINT #test
Helo,
My question is I have one Stored Procedure in SQL Server that returns counts of a field. I want to store the results of this Stored Procedure in a variable (scalar?) of a different stored procedure.
sp_My_Other_SP:
CREATE PROCEDURE [dbo].sp_My_Other_SP
#variable int OUTPUT -- The returned count
AS
BEGIN -- SP
SET NOCOUNT ON;
SET #SQL = "SELECT COUNT(*) FROM blah"
EXEC(#SQL)
END -- SP
I currently do it like:
DECLARE #count int
EXEC sp_My_Other_SP #count OUTPUT
Then I use it like
IF (#count > 0)
BEGIN
...
END
However its returning the other Stored Procedure results as well as the main Stored Procedure results which is a problem in my .NET application.
-----------
NoColName
-----------
14
-----------
MyCol
-----------
abc
cde
efg
(Above is an attempted representation of the results sets returned)
I would like to know if there is a way to store the results of a Stored Procedure into a variable that doesn't also output it.
Thanks for any help.
You can capture the results of the stored procedure into a temp table so it is not returned by the calling stored procedure.
create table #temp (id int, val varchar(100))
insert into #temp
exec sp_My_Other_SP #value, #value, #value, #count OUTPUT
Well, the easiest way to fix this is to recode the stored proc so that the select statement that returns the 'other' result set you don't want in this case is conditionally extecuted, only when you are NOT asking for the count
Add another parameter called #GetCount
#GetCount TinyInt Defualt = 0 // or
#GetCount Bit Default = 0
Then
instead of just
Select ...
write
If #GetCount = 1
Select ...
Have you tried changing
SET #SQL = "SELECT COUNT(*) FROM blah"
EXEC(#SQL)
to
SELECT #variable = COUNT(*) FROM blah"
-- don't do EXEC(#SQL)
?
THE FIRST PROCEDURE:
CREATE PROC DD43
#ID INT OUTPUT AS
(SELECT #ID=COUNT(*) FROM CS2)
SECOND PROCEDURE:
CREATE PROC DD45 AS
DECLARE #COUNT INT
DECLARE #COUN INT
EXEC DD43 #COUN OUT --CALLING THE FIRST PROCEDURE
SET #COUNT= (SELECT #COUN)
SELECT #COUNT
EXEC DD45