函数返回表变量

时间:2016-01-26 12:07:31

标签: sql sql-server tsql sql-function

我试图创建一个返回表变量的函数。首先,我从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结果还可以

2 个答案:

答案 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