Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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函数调用SQL函数_Sql_Sql Server - Fatal编程技术网

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

如何从另一个SQL函数调用SQL函数,sql,sql-server,Sql,Sql Server,在我的数据库中,我有两种类型的应用程序:有序列号的和没有序列号的。我想在SQL Server中创建一个函数,将2个nvarchars作为参数:首先是应用程序代码,另一个是序列号,并返回一个具有可用版本的表类型。此函数应首先检查应用程序是否有序列号,并根据答案(位类型)调用适当的函数。我怎样才能把这些放在一起 table getVersions(appCode, serial){ if(isFree(appCode)){ call getAppVersionsFree(appCode

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

table getVersions(appCode, serial){
  if(isFree(appCode)){
     call getAppVersionsFree(appCode); 
  } else {
     call getAppVersions(appCode,serial);
  }
return table;
检查应用程序是否有序列号或是否可用的功能:

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
如果应用程序是免费的,则要调用的函数:

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 
)
如果应用程序不是空闲的,则调用函数(带有序列号):

编辑:

如何让它工作

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
您有两个选项(在SQL中):

第一个选项是编写一个
多状态表值函数
。语法如下():

在您的情况下,这将是这样的:

RETURNS @returnVersions TABLE (Version INT)
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
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
            )
        )
    )
逻辑是这样的:

RETURNS @returnVersions TABLE (Version INT)
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
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
            )
        )
    )
第二个选项是修改函数以处理以下两种情况:

RETURNS @returnVersions TABLE (Version INT)
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
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语句,因此可能会出现拼写错误)

dbo.您是否已经尝试过某项操作?是否要在SQL Server中作为新的表值函数执行此操作,或者应该在应用程序中实现?@Pred函数的返回值应该是一个带有versions@laura:请检查答案getAppVersions(appCode,serialNo)和getAppVersionsFree(appCode)函数正在返回表。所以我不能调用它们向表中插入,因为它们返回多个值。表可以包含多个值。上述插入是一个标准插入。。。SELECT语句。你试过了吗?我编辑了这个问题。请看一看,并告诉我,如果有可能这样做。谢谢你是的,这是可能的,我的答案仍然有效。第二个选项在一个查询中实现这一点。第一个是您试图编写的新函数的框架。