Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在sql中创建函数时出错_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 在sql中创建函数时出错

Sql server 在sql中创建函数时出错,sql-server,sql-server-2008,Sql Server,Sql Server 2008,大家好,我正在尝试使用上述语法创建一个获得第二高工资的sql函数,但我遇到了错误: “函数中包含的Select语句无法将数据返回到客户端。” 任何人都可以告诉我写函数的实际语法是什么,或者用正确的语法返回我的代码。提前感谢。我要写的是使用以下方法: CREATE FUNCTION Salary.SecondHighestSalary() Returns int AS BEGIN Declare @salary int; SELECT TOP 1 salary FRO

大家好,我正在尝试使用上述语法创建一个获得第二高工资的sql函数,但我遇到了错误:

函数中包含的Select语句无法将数据返回到客户端。

任何人都可以告诉我写函数的实际语法是什么,或者用正确的语法返回我的代码。提前感谢。

我要写的是使用以下方法:

CREATE FUNCTION Salary.SecondHighestSalary()

Returns int

AS 

    BEGIN
    Declare @salary int;

  SELECT TOP 1 salary FROM (

  SELECT TOP 2 salary FROM Salary
  ORDER BY salary DESC
) as maxsalary ORDER BY salary ASC

Return @salary  
END
CREATE FUNCTION Salary.SecondHighestSalary()

Returns int

AS 

    BEGIN
    Declare @salary int;

  SELECT TOP 1 @salary = salary FROM (

  SELECT TOP 2 salary FROM Salary
  ORDER BY salary DESC
) as maxsalary ORDER BY salary ASC

Return @salary  
END

如果您需要处理例如领带(切换到或视情况而定),而
TOP
ORDER BY
方法不太适合处理领带,则可以方便地对其进行调整。

非常感谢,这确实对我有帮助。我能够成功构建功能,但现在,当我尝试使用:SELECT*FROM SecondHighestSalary()执行此操作时,它给出了一个错误:无效的对象名称“SecondHighestSalary”。请给出建议。您在
工资
模式中定义了此项。此外,您还定义了标量函数,而不是表值函数,因此您的调用语法需要有所不同。尝试运行
select Salary.SecondHighestSalary()
No,我在创建函数时更改了一些语法:CREATE function SecondHighestSalary()这是我的函数名,现在没有使用任何模式。如果调用SELECT SecondHighestSalary(),则会出现以下错误:“SecondHighestSalary”不是可识别的内置函数名。@user2289490-调用标量UDF时必须包含架构名。因此,如果它不再在
Salary
中,那么它可能在
dbo
中。
CREATE FUNCTION SecondHighestSalary()

Returns int

AS 
begin
    Return (
      select salary from (
         select salary,ROW_NUMBER() OVER (ORDER BY salary desc) as rn
         from Salary
        ) t
      where rn = 2);
END