如何从另一个SQL函数调用SQL函数
在我的数据库中,我有两种类型的应用程序:有序列号的和没有序列号的。我想在SQL Server中创建一个函数,将2个nvarchars作为参数:首先是应用程序代码,另一个是序列号,并返回一个具有可用版本的表类型。此函数应首先检查应用程序是否有序列号,并根据答案(位类型)调用适当的函数。我怎样才能把这些放在一起如何从另一个SQL函数调用SQL函数,sql,sql-server,Sql,Sql Server,在我的数据库中,我有两种类型的应用程序:有序列号的和没有序列号的。我想在SQL Server中创建一个函数,将2个nvarchars作为参数:首先是应用程序代码,另一个是序列号,并返回一个具有可用版本的表类型。此函数应首先检查应用程序是否有序列号,并根据答案(位类型)调用适当的函数。我怎样才能把这些放在一起 table getVersions(appCode, serial){ if(isFree(appCode)){ call getAppVersionsFree(appCode
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语句。你试过了吗?我编辑了这个问题。请看一看,并告诉我,如果有可能这样做。谢谢你是的,这是可能的,我的答案仍然有效。第二个选项在一个查询中实现这一点。第一个是您试图编写的新函数的框架。