31

Ecco il mio tipo di tabella definito dall'utente ...SQL Server 2008 - Come si restituisce un tipo di tabella definito dall'utente da una funzione con valori di tabella?

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

Questo è ciò che Ive ha avuto a che fare nella mia funzione con valori di tabella per restituire il tipo:

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

In sostanza, im dover ri -dichiara la mia definizione di tipo nell'istruzione RETURN della funzione. Non c'è un modo posso semplicemente dichiarare il tipo nell'istruzione RETURN?

avrei pensato che questo dovrebbe funzionare:

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

Non riesci a trovare alcun aiuto su MSDN/Google riguardo a questa .... qualcuno?

EDIT

io non marcato la mia risposta, e urtando questa domanda - come sto incontrando lo stesso scenario 6 mesi più tardi.

Qualcuno ha idea se sia possibile restituire un tipo di tabella definito dall'utente da una funzione con valori di tabella? In caso contrario, c'è una soluzione alternativa diversa da quella che ho fatto? (ripetere nuovamente il tipo).

+0

confermato non possibile con 2014. – dudeNumber4

risposta

9

Ok, quindi non è possibile.

Abbastanza facile da duplicare la definizione della tabella nel tipo restituito (con l'uso di script).

Ancora - si spera che questo problema venga corretto nella prossima versione di SQL Server.

+2

So che questa è una vecchia domanda, ma IMVHO si dovrebbe smarcare la risposta e contrassegnare la risposta di James come spiega e risolve il problema in modo appropriato. – slugster

0

Non credo sia possibile. Non è possibile utilizzare un UDTT come tipo di ritorno di una funzione con valori scalari perché non è un valore scalare. Non è inoltre possibile sostituire la dichiarazione della tabella di una funzione con valori di tabella con un UDTT. Ripetere la definizione della tabella sembra essere l'unica opzione. Se sapessimo perché lo stavi facendo, forse potremmo trovare un'alternativa.

+1

so che non posso restituire un UDT da una funzione scalare. Ma per quanto riguarda le funzioni di tabella - è possibile restituire tabelle (o variabili di tabella). Un UDT è solo un altro tavolo, quindi non capisco perché non puoi restituirlo. Oh bene, forse nella prossima versione di SS. =) Sto facendo questo perché ho una variabile di tabella che è stata duplicata tra numerose funzioni/procs. Quindi l'ho inserito in un UDT per evitare di essere "SECCO". Più facile da mantenere, ecc. – RPM1984

2

La sintassi per CREATE FUNCTION indica che l'unico modo per definire un tipo di ritorno tabella è elencando colonne e tipi, a <table_type_definition>. Anche SQL Server "Denali" ha la stessa definizione per <table_type_definition>. Sebbene stranamente, la sua sintassi non include funzioni con valori di tabella con istruzioni multiple o qualsiasi altra cosa che faccia riferimento a questo frammento.

+3

Quindi credo che la risposta sia ancora no. :) Dang. Tutto quello che sto cercando di ottenere qui è un tipo di "contratto" tra l'UDF e il codice che lo sta chiamando. Mantiene il T-SQL "D-R-Y". Non ha molto senso usare l'UDTT qui se non posso restituirlo dalla funzione. Oh bene. Grazie comunque. – RPM1984

0

No, non temere al momento, come da this question. E il seguente da MSDN:

Restrizioni

parametri con valori di tabella hanno le seguenti limitazioni:

  • SQL Server non mantiene statistiche sulle colonne di parametri con valori di tabella.

  • I parametri con valori di tabella devono essere passati come parametri READONLY di input per le routine Transact-SQL. Non è possibile eseguire operazioni DML come UPDATE, DELETE o INSERT su un parametro con valori di tabella nel corpo di una routine.

  • Non è possibile utilizzare un parametro con valori di tabella come destinazione di un'istruzione SELECT INTO o INSERT EXEC. Un parametro con valori di tabella può essere nella clausola FROM di SELECT INTO o nella stringa INSERT EXEC o stored-procedure.

21

Anche se non è possibile restituire l'UDTT da una funzione, è possibile restituire una variabile di tabella e di ricevere in un UDTT fino a quando la partita dello schema. Il seguente codice viene testato in SQL Server 2008 R2

- Crea l'UDTT

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

- dichiarare le variabili

DECLARE @uddt MyCustomUDDT; 
DECLARE @Modifieduddt MyCustomUDDT; 

// Chiamare la funzione

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

Funzione firma

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

Speriamo che questo possa aiutare qualcuno.

+0

Questa è una risposta migliore di quella attualmente contrassegnata. – slugster

Problemi correlati