2016-09-30 16 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