Как создать пользовательскую функцию, которая возвращает курсор из моего запроса - PullRequest
1 голос
/ 04 ноября 2010

Как создать «пользовательскую функцию», которая возвращает «курсор» обратно пользователю из следующего запроса:

SELECT 
   P.AddressId,
   P.DepartmentId
FROM
   Person P
INNER JOIN
   ACCOUNT A
ON p.UserId = A.UserId

Я ищу решение, написанное на TSQL и совместимое с SS2008. Любой столбец с меткой Id имеет тип int. Мы хотели бы вернуть вызывающему объекту два столбца, а не просто скаляр. Мы намереваемся вызвать функцию и написать дополнительные запросы для результата этой функции.

Edit: Согласно StarShip3000, решение состоит в том, чтобы вернуть таблицу. Я считаю, что ЦКЛ для этого:

CREATE FUNCTION nameOfFunction()
RETURNS @result TABLE
(
   AddressId INT,
   DeviceId INT
)
AS
BEGIN
INSERT INTO @result (AddressId, DeviceId)

SELECT 
   P.AddressId,
   P.DepartmentId
FROM
   Person P
INNER JOIN
   ACCOUNT A
ON p.UserId = A.UserId

RETURN
END

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

По звукам того, что вы пытаетесь сделать, вы можете использовать временную таблицу, вставляя в нее свои данные и ссылаясь на эту таблицу ниже в стеке вызовов вашего сеанса. Так что вызовите proc1 (вставить строки в #MyTable) -> proc2 (прочитать строки из #MyTable) -> proc3 и т. Д.

Скорее всего, ваш коллега пришел из магазина Oracle, где курсоры оптимизированы и фактически используются постоянно, хотя в большинстве случаев все еще не являются идеальным решением. В SQL Server курсоры обычно считаются дьяволом из-за того, что они не оптимизируются, как для Oracle. В SQL Server 2008 и более поздних версиях вы также можете использовать табличные параметры для передачи наборов данных в и из процедур. В действительности вы всегда можете сделать это, используя временные таблицы сессий. Я нахожусь на SQL Server 2012, и мне еще не нужно использовать табличные параметры, потому что временные таблицы работают так хорошо, но я уверен, что есть случаи, когда более поздние могут работать так же или лучше.

Хотя в любой реляционной базе данных всегда важно использовать логику, основанную на множествах, когда это возможно, и избегать любых конструкций или схем, которые потребуют от вас цикл за строкой. Конечно, есть крайние случаи, когда, возможно, это единственный путь, но убедитесь, что это единственный путь.

0 голосов
/ 04 ноября 2010

Мой вопрос: зачем вам функция, которая возвращает addressId и DepartmentId? Кажется слишком тривиальным, чтобы заслужить создание для него функции. Я не понимаю, как функция будет полезна в этой ситуации.

Вы, ребята, имеете в виду представления вместо функций ???

Так что тогда просто создайте вид.

CREATE VIEW dbo.vw_proprietryInfo
AS
BEGIN
   SELECT 
      P.AddressId,
      P.DepartmentId
   FROM
      Person P
      INNER JOIN ACCOUNT A
         ON p.UserId = A.UserId
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...