2015-01-29 3 views
0

Если тип возвращаемого значения моей функции Table-Valued является одной из моих существующих таблиц, например TBL, мне все еще нужно записывать все имена, типы и длины столбцов в сигнатуре функции или есть способ сказать, что эта функция возвращает таблицу TBL?Тип возвращаемого значения для таблицы-значения

Быстрый пример: Скажем, у меня есть таблица TBL с двумя полями (собственно табличным я работаю с намного шире):

TBL 
{ 
    ID int NOT NULL 
    Name varchar(100) NOT NULL 
} 

Моей таблицей многозначной функции выполняет некоторую сложную фильтрацию на столе и возвращает соответствующие строки без каких-либо прогнозов столбцов, т. е. возвращаются целые строки. В настоящее время функция выглядит следующим образом:

CREATE FUNCTION GetHistory 
(
    --some params 
) 
RETURNS 
@RetVal TABLE        <<<<< 
(          <<<<< 
    ID int NOT NULL,      <<<<< 
    Name varchar(100) NOT NULL   <<<<< 
)           <<<<< 
AS 
BEGIN 
    --Logic here 
    RETURN; 
END 

Как вы видите, я копирую всю структуру моей таблицы в предложении RETURNS. Есть ли способ, чтобы я мог просто сказать SQL Server, что эта функция возвращает структуру TBL вместо написания всех столбцов здесь? Что-то вроде:

CREATE FUNCTION GetHistory 
(
    --some params 
) 
RETURNS 
@RetVal TBL        <<<<<<< 
AS 
BEGIN 
    --Logic here 
    RETURN; 
END 

(Целевая платформа SQL Server 2008 R2 и выше)

+0

И как вы ожидаете, что FUNCTION справится с изменением определения TBL? – Paparazzi

+0

@Blam: Как взгляды имеют отношение к изменению определения TBL? – dotNET

+0

Почему вы спрашиваете меня о просмотрах? Если у вас есть вопрос о мнениях, задайте другой вопрос. Этот вопрос, конечно, не является ответом на мой вопрос/ – Paparazzi

ответ

0

Вы можете переписать как:

CREATE FUNCTION GetHistory() 
RETURNS TABLE 
AS 

RETURN 
    SELECT ID, Name 
    FROM TableName 

EF:

 var ee = new Entities(); 
     var c = ee.GetHistory().ToList; 

ADO:

var conn = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString; 

       using (var connection = new SqlConnection(conn)) 
       { 

        string sqlSelect = "SELECT * FROM dbo.GetHistory()"; 
        connection.Open(); 

        SqlDataAdapter da = new SqlDataAdapter(sqlSelect, conn); 
        DataTable dt = new DataTable(); 
        da.Fill(dt); 
       } 
+0

Действительно? Будут ли инструменты клиента, такие как .NET DataSet, правильно читать возвращаемый тип этой функции (в дизайнере я имею в виду)? – dotNET

+0

Также обратите внимание, что моя функция строит запрос с помощью конкатенации строк, поэтому я не буду писать запрос перед ключевым словом 'RETURN'. Это проблема? – dotNET

+1

@dotNET - «моя функция создает запрос посредством конкатенации строк» ​​- если вы имеете в виду, что вы делаете динамический SQL, вы уже ошиблись, вы не можете «EXEC' из UDF. –

Смежные вопросы