views:

22

answers:

1

i want to define a scaller fucntion which in that im giong to return the result into a variable but i do not know how to do this.

CREATE FUNCTION dbo.Funname ( @param int )
RETURNS INT
AS
declare @returnvar int
select  @returnvar = select colname from tablename where someconditions = something
return(@returnvar)

i want to make a function something like the top. i mean the result of the select statement which is:

select colname from tablename where someconditions = something

is only a single cell and we are sure about it. i want to store it into a variable and return it from the function. how can i implement this thing?

+1  A: 

I should probably mention that scalar UDFs do come with a considerable health warning and can cause performance issues depending upon how you use them.

Here's an example though.

CREATE FUNCTION dbo.Funname ( @param INT )
RETURNS INT
WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
RETURN (SELECT number FROM master.dbo.spt_values WHERE number < @param)
END

In the above example I didn't use a variable as it is redundant. The version with variable is

BEGIN
DECLARE @Result int
SET @Result = (SELECT number FROM master.dbo.spt_values WHERE number < @param)
RETURN @Result
END

For both of the above you would need to be sure the Query returned at most one row to avoid an error at runtime. For example

select dbo.Funname(-1) Returns -32768

select dbo.Funname(0) Returns error "Subquery returned more than 1 value."

An alternative syntax would be

BEGIN
DECLARE @Result int
SELECT @Result = number FROM master.dbo.spt_values WHERE number < @param
RETURN @Result
END

This would no longer raise the error if the subquery returned more than one value but you would just end up with an arbitrary result with no warning - which is worse.

Following Comments I think this is what you need

CREATE FUNCTION dbo.getcustgrade(@custid CHAR(200)) 
RETURNS INT 
WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
        RETURN
        ( SELECT [cust grade]
        FROM    ( SELECT  customerid,
                         DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) AS [cust grade]
                FROM     Orders
                GROUP BY CustomerID
                )
                d
        WHERE   customerid = @custid
        )
END
Martin Smith
i wrote this query in conclusion but it returns error in creating the funtion: CREATE FUNCTION dbo.getcustgrade ( @custid char(200) )RETURNS INT WITH RETURNS NULL ON NULL INPUT AS beginreturn(select Orders.CustomerID, DENSE_RANK() OVER (ORDER BY count(*) desc) AS [cust grade] from Orderswhere customerid = @custid group by CustomerID ) end
the error is: Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
You can't return both `Orders.CustomerID` and the rank. You would just need to select the Rank. That query doesn't look right anyway.
Martin Smith
thanks. solved completely.