Подтвердить что ты не робот

Как я могу присоединиться к хранимой процедуре?

У меня есть хранимая процедура, которая не принимает никаких параметров, и возвращает два поля. Хранимая процедура суммирует все транзакции, которые применяются к арендатору, и возвращает баланс и идентификатор арендатора.

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

Это мой текущий запрос:

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo,
        u.UnitNumber,
        p.PropertyName
FROM tblTenant t
    LEFT JOIN tblRentalUnit u
    ON t.UnitID = u.ID

    LEFT JOIN tblProperty p
    ON u.PropertyID = p.ID

ORDER BY p.PropertyName, t.CarPlateNumber

Сохраненная процедура такова:

SELECT tenant.ID AS TenantID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance FROM tblTenant tenant
    LEFT JOIN tblTransaction trans
    ON tenant.ID = trans.TenantID
    GROUP BY tenant.ID

Я также хотел бы добавить баланс из хранимой процедуры.

Как я могу это сделать?

4b9b3361

Ответ 1

Мне действительно нравится предыдущий ответ (не используйте SP), но если вы по какой-то причине привязаны к самому SP, вы можете использовать его для заполнения таблицы temp, а затем присоединиться к таблице temp. Обратите внимание, что вы будете стоить себе дополнительные дополнительные накладные расходы, но это единственный способ, которым я могу думать о фактическом сохраненном proc.

Опять же, вам может быть лучше вставить запрос из SP в исходный запрос.

Ответ 2

вставьте результат SP в временную таблицу, затем присоедините:

CREATE TABLE #Temp (
    TenantID int, 
    TenantBalance int
)

INSERT INTO #Temp
EXEC TheStoredProc

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo,
    u.UnitNumber, p.PropertyName
FROM tblTenant t
INNER JOIN #Temp ON t.TenantID = #Temp.TenantID
...

Ответ 3

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

Ответ 4

Ваша хранимая процедура может быть легко использована в качестве представления. Затем вы можете присоединиться к нему на все, что вам нужно.

SQL:

CREATE VIEW vwTenantBalance
AS

 SELECT tenant.ID AS TenantID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
 FROM tblTenant tenant
 LEFT JOIN tblTransaction trans
 ON tenant.ID = trans.TenantID
 GROUP BY tenant.ID

Вы можете сделать любое утверждение, например:

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, 
    t.Memo, u.UnitNumber, p.PropertyName, TenantBalance
FROM tblTenant t
LEFT JOIN tblRentalUnit u
 ON t.UnitID = u.ID
LEFT JOIN tblProperty p
 ON u.PropertyID = p.ID
LEFT JOIN vwTenantBalance v 
 ON t.ID = v.tenantID
ORDER BY p.PropertyName, t.CarPlateNumber

Ответ 5

Я решил эту функцию записи проблемы вместо процедуры и использовал CROSS APPLY в инструкции SQL. Это решение работает с SQL 2005 и более поздними версиями.

Гедиминас Букаускас

Ответ 6

Как уже было сказано, лучший способ обхода - преобразовать хранимую процедуру в SQL-функцию или представление.

Краткий ответ, как уже упоминалось выше, заключается в том, что вы не можете напрямую подключиться к хранимой процедуре в SQL, если только вы не создаете другую хранимую процедуру или функцию, используя вывод хранимой процедуры во временную таблицу и ВЗАИМОДЕЙСТВИЕ временной таблицы, как объяснено выше.

Я отвечу на это, переведя вашу хранимую процедуру в функцию SQL и покажу, как использовать ее в запросе по вашему выбору.

CREATE FUNCTION fnMyFunc()
RETURNS TABLE AS
RETURN 
(
  SELECT tenant.ID AS TenantID, 
       SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
  FROM tblTenant tenant
    LEFT JOIN tblTransaction trans ON tenant.ID = trans.TenantID
  GROUP BY tenant.ID
)

Теперь, чтобы использовать эту функцию в вашем SQL...

SELECT t.TenantName, 
       t.CarPlateNumber, 
       t.CarColor, 
       t.Sex, 
       t.SSNO, 
       t.Phone, 
       t.Memo,
       u.UnitNumber,
       p.PropertyName
FROM tblTenant t
    LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID
    LEFT JOIN tblProperty p ON u.PropertyID = p.ID
    LEFT JOIN dbo.fnMyFunc() AS a
         ON a.TenantID = t.TenantID
ORDER BY p.PropertyName, t.CarPlateNumber

Если вы хотите передать параметры в свою функцию из вышеуказанного SQL, я рекомендую вам использовать CROSS APPLY или CROSS OUTER APPLY.

Прочитайте этот здесь.

Приветствия

Ответ 7

Я надеюсь, что ваша хранимая процедура не выполняет цикл курсора!

Если нет, возьмите запрос из хранимой процедуры и проинтегрируйте этот запрос в запросе, который вы публикуете здесь:

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo,
        u.UnitNumber,
        p.PropertyName
        ,dt.TenantBalance
FROM tblTenant t
    LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID
    LEFT JOIN tblProperty   p ON u.PropertyID = p.ID
    LEFT JOIN (SELECT ID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance
                   FROM tblTransaction
                   GROUP BY tenant.ID
              ) dt ON t.ID=dt.ID
ORDER BY p.PropertyName, t.CarPlateNumber

Если вы делаете нечто большее, чем запрос в своей хранимой процедуре, создайте временную таблицу и выполните хранимую процедуру в этой временной таблице, а затем присоединитесь к ней в своем запросе.

create procedure test_proc
as
  select 1 as x, 2 as y
  union select 3,4 
  union select 5,6 
  union select 7,8 
  union select 9,10
  return 0
go 

create table #testing
(
  value1   int
  ,value2  int
)

INSERT INTO #testing
exec test_proc


select
  *
  FROM #testing

Ответ 8

Почему бы просто не выполнить вычисления в вашем SQL?

SELECT 
  t.TenantName
  , t.CarPlateNumber
  , t.CarColor
  , t.Sex
  , t.SSNO
  , t.Phone
  , t.Memo
  , u.UnitNumber
  , p.PropertyName
  , trans.TenantBalance
FROM tblTenant t
     LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID
     LEFT JOIN tblProperty p ON u.PropertyID = p.ID
     INNER JOIN (
       SELECT tenant.ID AS TenantID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
       FROM tblTenant tenant
            LEFT JOIN tblTransaction trans ON tenant.ID = trans.TenantID
       GROUP BY tenant.ID
     ) trans ON trans.ID = t.ID
ORDER BY 
  p.PropertyName
  , t.CarPlateNumber