2016-09-30 17 views
3

函数中创建新表创建一个函数,该函数返回像下面如何在SQL

CREATE FUNCTION dbo.splitText(@strArgs VARCHAR(4000)) 
    RETURNS @tab TABLE 
    (
     [Key] VARCHAR(255) NOT NULL, 
     Value VARCHAR(4000) NOT NULL 
    ) 
    AS 
    BEGIN 

INSERT INTO @tab VALUES('Key1', 'Value1') 
INSERT INTO @tab VALUES('Key2', 'Value2') 

RETURN 
END 
GO 

OUtput: 
Key Value 
************* 
Key1 Value1 
Key2 Value2 

第二个功能我需要的,是从上述机能的研究返回表值的表值。

CREATE FUNCTION dbo.TableValuedParameterExample11() 
RETURNS @TmpTable1 table (Value VARCHAR(4000) NOT NULL) 
AS 
BEGIN 
DECLARE @StateDescp VARCHAR(250) 
Select * into TmpTable1 from (Select value from dbo.Splittext('Test')) aa 

RETURN 
END 
GO 

完成功能后,我正在运行下面的查询。

Select * from TmpTable1

输出,我需要

Value 
******** 
Value1 
Value2 

我需要这一点放。

但是当你写select * into [table]...你必须确保在[table]不列入存在我得到了错误

Invalid use of a side-effecting operator 'SELECT INTO' within a function. 
+2

您需要使用存储过程。在函数 –

+0

中不允许使用DDL,但我需要多次调用该函数。所以需要结束我可以使用“Select * from TmpTable1”这个查询@Nadeem – Meline

+0

如果第二个函数中的TmpTable1是一个基表,你不能插入任何记录,因为函数不需要使用存储过程,它将与声明的表一起工作。 – Nadeem

回答

6

。改为使用insert into [table] select ...。当您处理变量或功能表时,您还需要一个@

CREATE FUNCTION dbo.TableValuedParameterExample11() 
RETURNS @TmpTable1 table (Value VARCHAR(4000) NOT NULL) 
AS 
BEGIN 
DECLARE @StateDescp VARCHAR(250) 
INSERT INTO 
    @TmpTable1([Value]) 
SELECT 
    value 
FROM 
    dbo.SplitArgs('Test')) aa 

RETURN 
END 
GO 
+0

运行此功能后。我可以使用Temptable吗?像这样“从@ TmpTable1中选择*”。 Tedo.G – Meline

+0

不,你可以做一个连接到这个函数,如:'SELECT * FROM SomeTable s INNER JOIN dbo.TableValuedParameterExample1()d ON d。[value] = s。[value]' – gofr1

+0

请用上面的示例@ gofr1 – Meline