SQL 使用 return 函数值作为过程参数

SQL use return value of function as procedure parameter

让我们定义:

create table cities
(
    ID int identity,
    name varchar(50) unique
)


create function getID (@name varchar(50)) returns int
begin
    declare @id int
    select @id=ID from cities where name=@name
    return @id
end

create procedure addLine
    @cityID int
as begin
    ...
end

是否可以使用函数返回值执行一个过程,如下所示?

exec addLine getID('Warsaw')
exec addLine dbo.getID('Warsaw')
exec addLine (select dbo.getID('Warsaw'))

我上面试过了,没有用。

Microsoft 表示这是不可能的。您不能将函数的结果作为参数传递给过程:

[ { EXEC | EXECUTE } ]
    { 
      ...
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      ...
    }
[;]

因此,只允许常量值、变量和 DEFAULT 关键字。 执行此操作的 2 种可能方法是:

1: 声明变量

declare @i int =  dbo.getID('Warsaw')
exec addLine @i

2:使用动态查询

DECLARE @cmd NVARCHAR(MAX) = 'exec addLine ' + CAST(dbo.getID('Warsaw') AS NVARCHAR(MAX))
EXEC(@cmd)

这将 "execute a procedure with value returned by function"

就是不行'inline'

declare @id int
select @id = dbo.getID('Warsaw')
exec addLine @id