31

這裏是我的用戶定義的表型...SQL Server 2008 - 如何從表值函數返回用戶定義的表類型?

CREATE TYPE [dbo].[FooType] AS TABLE(
[Bar] [INT], 
) 

這是香港專業教育學院在我的表值函數來做返回類型:

CREATE FUNCTION [dbo].[GetFoos] 
RETURN @FooTypes TABLE ([Bar] [INT]) 
INSERT INTO @FooTypes (1) 
RETURN 

基本上,不必重新IM在函數的RETURN語句中聲明我的類型定義。沒有辦法,我可以簡單地在RETURN語句中聲明類型?

我還以爲這會工作:

CREATE FUNCTION [dbo].[GetFoos] 
RETURN @FooTypes [FooType] 
INSERT INTO @FooTypes (1) 
RETURN 

找不到對此....任何人在MSDN /谷歌的任何幫助嗎?

編輯

我無人盯防我的答案,並撞到了這個問題 - 因爲我6個月以後遇到同樣的情況。

有沒有人有任何想法,如果有可能從表值函數返回用戶定義的表類型?如果沒有,除了我所做的之外,是否還有更好的解決方法? (重新聲明類型)。

+0

確認仍然不可能與2014. – dudeNumber4 2015-01-22 14:11:46

回答

9

好的 - 所以不能這樣做。

很容易複製返回類型中的表定義(使用腳本)。

仍然 - 希望這個問題在下一個版本的SQL Server中得到糾正。

+2

我知道這是一個老問題,但IMVHO您應該取消選中您的答案並標記James的答案,因爲它解釋並很好地解決了問題。 – slugster 2017-01-11 03:36:24

0

我不相信這是可能的。您不能使用UDTT作爲標量值函數的返回類型,因爲它不是標量值。您也不能用UDTT替換表值函數的表格聲明。重複表格定義似乎是唯一的選擇。如果我們知道你爲什麼這樣做,也許我們可以找到一個替代方案。

+1

我知道我不能從一個標量函數返回一個UDT。 但是關於表函數 - 你可以返回表(或表變量)。一個UDT只是另一個表,所以不能看到你爲什麼不能返回它。哦,也許在SS的下一個版本中。 =) 我這樣做是因爲我有一個表變量被重複衆多的函數/特效。因此,我把它放在UDT中以防止被「幹」。更容易維護等。 – RPM1984 2010-06-25 00:01:14

2

CREATE FUNCTION的語法表示定義表返回類型的唯一方法是列出列和類型,<table_type_definition>。即使SQL Server "Denali"<table_type_definition>具有相同的定義。雖然很奇怪,但它的語法不包括多語句表值函數或其他任何引用此片段的函數。

+3

所以我想答案仍然沒有。 :)當。所有我試圖在這裏實現的是UDF和調用它的代碼之間的一種「契約」。保留T-SQL「D-R-Y」。如果我無法從函數中返回,那麼即使在這裏使用UDTT也沒有多少意義。好吧。不管怎麼說,還是要謝謝你。 – RPM1984 2010-12-16 09:17:33

0

不,現在不怕,根據this question。而從MSDN以下:

限制

表值參數有以下限制:

  • SQL Server不維護表值參數列的統計信息。

  • 表值參數必須作爲輸入READONLY參數傳遞給Transact-SQL例程。您無法對例程正文中的表值參數執行DML操作,例如UPDATE,DELETE或INSERT。

  • 不能使用表值參數作爲SELECT INTO或INSERT EXEC語句的目標。表值參數可以位於SELECT INTO的FROM子句中,也可以位於INSERT EXEC字符串或存儲過程中。

21

即使你不能從一個函數返回的UDTT,你可以返回一個表變量,並在UDTT 只要接受它作爲模式匹配。下面的代碼在SQL服務器測試2008 R2

- 創建UDTT

CREATE TYPE dbo.MyCustomUDDT AS TABLE 
(
    FieldOne varchar (512), 
    FieldTwo varchar(1024) 
) 

- 聲明變量

DECLARE @uddt MyCustomUDDT; 
DECLARE @Modifieduddt MyCustomUDDT; 

//調用函數

INSERT INTO @Modifieduddt SELECT * FROM dbo.MyUDF(@uddt); 

功能簽名

CREATE FUNCTION dbo.MyUDF(@localUDDT MyCustomUDDT) 
RETURNS @tableVar TABLE 
(
    FieldOne varchar (512), 
    FieldTwo varchar(1024) 
) 
AS 
BEGIN 
--Modify your variable here 
RETURN 
END 

希望這會幫助某人。

+0

這是比當前標記的更好的答案。 – slugster 2017-01-11 03:34:03

相關問題