函数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