在我的数据库中,我有两种类型的应用程序:序列号和没有序列号。我想在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.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
)编辑:
怎么才能让这个起作用?
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发布于 2014-06-05 14:45:57
您有两个选项(在SQL中):
第一个选项是编写一个Multistatement Table-valued Function。语法如下(来自MSDN):
--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声明所在的行:
RETURNS @return_variable TABLE <table_type_definition>在你的例子中,这会是这样的:
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语句,所以可能会有排印)
https://stackoverflow.com/questions/24062722
复制相似问题