首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从另一个SQL函数调用SQL函数

如何从另一个SQL函数调用SQL函数
EN

Stack Overflow用户
提问于 2014-06-05 14:21:47
回答 1查看 471关注 0票数 0

在我的数据库中,我有两种类型的应用程序:序列号和没有序列号。我想在Server中创建一个函数,它以参数2 nvarchars为参数:首先是应用程序代码,另一个是序列号,并返回一个带有可用版本的表类型。这个函数应该首先检查应用程序是否有序列号,并根据答案(位类型)调用适当的函数。我怎么才能把这些放在一起呢?

代码语言:javascript
复制
table getVersions(appCode, serial){
  if(isFree(appCode)){
     call getAppVersionsFree(appCode); 
  } else {
     call getAppVersions(appCode,serial);
  }
return table;

检查应用程序是否有序列号或是否空闲的函数:

代码语言:javascript
复制
create function dbo.isFree(
   @appCode nvarchar(128))
returns bit
as 
begin
   declare @ret bit
   select @ret = (select a.IsFree from Application a where a.Code=@appCode)
   return @ret
end

如果应用程序是空闲的,则调用:

代码语言:javascript
复制
create function dbo.getAppVersionsFree
(
   @appCode nvarchar(128))
returns table as
return (
   select v.Version from Version v 
   inner join Application a on a.Code = v.AppCode
   inner join SerialNumber s on a.Code = s.AppCode
   where a.Code = @appCode 
)

如果应用程序没有空闲(带有序列号),将调用如下函数:

代码语言:javascript
复制
create function dbo.getAppVersions
(
   @appCode nvarchar(128),
   @serialNo nvarchar(128))
   returns table as
   return (
      select v.Version from Version v 
      inner join Application a on a.Code = v.AppCode
      inner join SerialNumber s on a.Code = s.AppCode
      where a.Code = @appCode and s.SerialNo = @serialNo
)

编辑:

怎么才能让这个起作用?

代码语言:javascript
复制
create function dbo.getVersions
(
   @appCode nvarchar(128),
   @serialNo nvarchar(128))   
returns table 
as
begin
declare @returnTable table (Version nvarchar(10))
if(dbo.isFree(@appCode) = 0) begin  
    set @returnTable = select dbo.getAppVersions(@appCode,@serialNo)
    end
else begin
   set @returnTable = select dbo.getAppVersionsFree(@appCode)
   end
return @returnTable;
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-05 14:45:57

您有两个选项(在SQL中):

第一个选项是编写一个Multistatement Table-valued Function。语法如下(来自MSDN):

代码语言:javascript
复制
--Transact-SQL Multistatement Table-valued Function Syntax
CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] [READONLY] } 
    [ ,...n ]
  ]
)
RETURNS @return_variable TABLE <table_type_definition>
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
        function_body
        RETURN
    END
[ ; ]

在这种情况下,您应该将所选记录INSERT到声明的返回(表)变量中。您可以用多语句函数编写逻辑。

诀窍在于RETURN声明所在的行:

代码语言:javascript
复制
RETURNS @return_variable TABLE <table_type_definition>

在你的例子中,这会是这样的:

代码语言:javascript
复制
RETURNS @returnVersions TABLE (Version INT)

逻辑是这样的:

代码语言:javascript
复制
IF (dbo.IsFree( ... )) BEGIN
    INSERT INTO @returnVersion (Version) SELECT Version FROM dbo.GetVersionsFree( ... )
END
ELSE BEGIN
    INSERT INTO @returnVersion (Version) SELECT Version FROM dbo.GetVersions( ... )
END

第二个选项是修改您的函数以处理这两种情况,如下所示:

代码语言:javascript
复制
SELECT
    v.Version
FROM
    Version v 
    INNER JOIN Application a
        ON a.Code = v.AppCode
WHERE
    a.Code = @appCode
    AND (
        -- The given application is free
        a.IsFree = 1

        -- The serial number should exist when the application is not free
        OR (
            a.IsFree = 0
            AND EXISTS (
                SELECT 1
                FROM SerialNumber s
                WHERE a.Code = s.AppCode AND s.SerialNo = @serialNo
            )
        )
    )

(请注意,我没有测试这个select语句,所以可能会有排印)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24062722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档