我试图创建一个返回表变量的函数。首先,我从Table1获取数据并将其放入另一个表变量中。这里我想检查这个变量是否为空,函数返回参数结果,否则返回表变量的结果 函数脚本如下:
USE[DATABase1]
GO
IF OBJECT_ID (N'CodeFunc', N'TF') IS NOT NULL DROP FUNCTION dbo.CodeFunc;
GO
CREATE FUNCTION CodeFunc ( @Code nvarchar(4) , @Table nvarchar(40) = '' )
RETURNS @VirtualDAT TABLE
(
RowID INT IDENTITY ( 1 , 1 ),
Code nvarchar(400)
)
AS
BEGIN
DECLARE @CodeM nvarchar(400)
DECLARE @imax INT SET @imax = @@ROWCOUNT
DECLARE @i INT SET @i = 1
DECLARE @SelectDAT TABLE
(
RowID INT IDENTITY ( 1 , 1 ),
Code nvarchar(400)
)
INSERT @SelectDAT
SELECT Code FROM table1
WHERE table1.id = 41
IF(EXISTS (SELECT 1 FROM @SelectDAT))
BEGIN
WHILE (@i <= @imax)
BEGIN
SELECT @CodeM = Code FROM @SelectDAT WHERE RowID = @i
INSERT INTO @VirtualDAT(Code) VALUES (@CodeM)
SET @i = @i + 1
END
END
ELSE
INSERT INTO @VirtualDAT(Code) VALUES (@Code)
RETURN
END
所以这个脚本无需将其置于函数内即可运行。
我测试这个函数是这样的:SELECT * FROM dbo.CodeFunc( 'toto',Default )
结果是:
IF(EXISTS (SELECT 1 FROM @SelectDAT))
没有回复记录
esle结果还可以
答案 0 :(得分:3)
正如VR46所说。 @@ ROWCOUNT将设置为0,因为之前没有查询。在函数中执行的任何代码都作为单独的查询集发生。它可能在函数外部返回一个值,因为您之前已将查询窗口用于另一个不相关的查询
你可以非常显着地重新考虑这个功能。看下面,@@ ROWCOUNT将在这里工作,因为它就在插入查询之后,肯定会有一个基于插入的值。
我无法对此进行测试,但我认为这样的事情应该做同样的工作。
USE[DATABase1]
GO
IF OBJECT_ID (N'CodeFunc', N'TF') IS NOT NULL DROP FUNCTION dbo.CodeFunc;
GO
CREATE FUNCTION CodeFunc ( @Code nvarchar(4) , @Table nvarchar(40) = '' )
RETURNS @VirtualDAT TABLE
(
RowID INT IDENTITY ( 1 , 1 ),
Code nvarchar(400)
)
AS
BEGIN
insert into @VirtualDAT
Select Code from table1 where table1.id = 41
if @@ROWCOUNT = 0
begin
INSERT INTO @VirtualDAT(Code) VALUES (@Code)
end
RETURN
END
答案 1 :(得分:2)
由于您在使用@imax
初始化@@ROWCOUNT
变量后,正在declaration
分配zero
@@ROWCOUNT
。
来自MSDN
@imax
返回受最后一个语句影响的行数。
如果没有错,您需要在insert into..select
查询后为INSERT @SelectDAT
SELECT Code FROM table1
WHERE table1.id = 41
SET @imax= @@ROWCOUNT
分配值。
SET BASED APPROACH
您可以在while
中执行相同操作而不使用CREATE FUNCTION Codefunc (@Code NVARCHAR(4),
@Table NVARCHAR(40) = '')
returns @VirtualDAT TABLE (
rowid INT IDENTITY ( 1, 1 ),
code NVARCHAR(400))
AS
BEGIN
IF EXISTS (SELECT code
FROM table1
WHERE table1.id = 41)
BEGIN
INSERT INTO @VirtualDAT
(code)
SELECT code
FROM table1
WHERE table1.id = 41
END
ELSE
INSERT INTO @VirtualDAT
(code)
VALUES (@Code)
RETURN
END
循环。
objectId