函数returntable变量
Function return table variable
我正在尝试创建一个 return 和 table variable.So 的函数,首先我从 Table1 获取数据并将其放入另一个 table 变量中。在这里我想检查这个变量是否为函数 return 参数结果否则 return table 变量的结果
函数脚本如下:
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))
没有记录 returned
esle 结果还可以
由于您在 declaration
变量将用 zero
初始化之后立即将 @imax
赋值给 @@ROWCOUNT
。
来自 MSDN
@@ROWCOUNT
Returns the number of rows affected by the last statement.
如果没有错,您需要在 insert into..select
查询后将值赋给 @imax
。
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
正如VR46所说。 @@ROWCOUNT 将设置为 0,因为它之前没有查询。在函数中执行的任何代码都作为一组单独的查询发生。它可能在函数外部返回一个值,因为您之前曾将查询 window 用于另一个不相关的查询
您可以 re-factor 这个功能非常显着。看下面,@@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
我正在尝试创建一个 return 和 table variable.So 的函数,首先我从 Table1 获取数据并将其放入另一个 table 变量中。在这里我想检查这个变量是否为函数 return 参数结果否则 return table 变量的结果 函数脚本如下:
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))
没有记录 returned
esle 结果还可以
由于您在 declaration
变量将用 zero
初始化之后立即将 @imax
赋值给 @@ROWCOUNT
。
来自 MSDN
@@ROWCOUNT
Returns the number of rows affected by the last statement.
如果没有错,您需要在 insert into..select
查询后将值赋给 @imax
。
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
正如VR46所说。 @@ROWCOUNT 将设置为 0,因为它之前没有查询。在函数中执行的任何代码都作为一组单独的查询发生。它可能在函数外部返回一个值,因为您之前曾将查询 window 用于另一个不相关的查询
您可以 re-factor 这个功能非常显着。看下面,@@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