Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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中带有while循环的用户定义函数_Sql_Sql Server_User Defined Functions - Fatal编程技术网

SQL Server中带有while循环的用户定义函数

SQL Server中带有while循环的用户定义函数,sql,sql-server,user-defined-functions,Sql,Sql Server,User Defined Functions,我被要求在SQL Server中创建一个用户定义的函数,以返回以下模式(例如,如果输入=5): 这是我的密码: alter function udf_star (@input int) returns varchar (200) as begin declare @star int set @star = @input declare @space int set @space = 0 while @star > 0 begin

我被要求在SQL Server中创建一个用户定义的函数,以返回以下模式(例如,如果输入=5):

这是我的密码:

alter function udf_star (@input int)
returns varchar (200)
as 
begin 
    declare @star int 
    set @star = @input 

    declare @space int 
    set @space = 0

    while @star > 0
    begin 
        declare @string varchar (200)
        set @string = replicate (' ', @space) + replicate ('*', @star)

        set @star = @star - 1
        set @space = @space + 1  
    end 

    return @string 
end 
当我执行函数时

select dbo.udf_star (5)
它只显示

'    *'
(4格+1星);有人能指出我应该如何更正语法吗


提前谢谢

您可能需要一个表值函数

此外,应尽可能避免循环

示例

CREATE FUNCTION [dbo].[tvf-Star] (@Input int)
Returns Table 
As
Return (  

Select Top (@Input) 
       Stars = replicate(' ',@Input-N)+replicate('*',N)
 From ( Select Top (@Input) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1 ) A
 Order By N Desc
)
如果您愿意:

Select * from [dbo].[tvf-Star](5)
结果

Stars
*****
 ****
  ***
   **
    *

看起来您可能需要一个表值函数

此外,应尽可能避免循环

示例

CREATE FUNCTION [dbo].[tvf-Star] (@Input int)
Returns Table 
As
Return (  

Select Top (@Input) 
       Stars = replicate(' ',@Input-N)+replicate('*',N)
 From ( Select Top (@Input) N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1 ) A
 Order By N Desc
)
如果您愿意:

Select * from [dbo].[tvf-Star](5)
结果

Stars
*****
 ****
  ***
   **
    *

. .(1) 使用我在前面的答案中建议的递归CTE;(2) 您似乎想要返回一个表,而不是一个标量值。谢谢@GordonLinoff,是的,CTE是一个很好的解决方案,但我正在尝试不同的SQL工具,不知道如何通过UDF实现这一点。(1) 使用我在前面的答案中建议的递归CTE;(2) 您似乎想要返回一个表,而不是一个标量值。谢谢@GordonLinoff,是的,CTE是一个很好的解决方案,但我正在尝试不同的SQL工具,不知道如何通过UDF实现这一点。