Как я могу присоединиться к хранимой процедуре?
У меня есть хранимая процедура, которая не принимает никаких параметров, и возвращает два поля. Хранимая процедура суммирует все транзакции, которые применяются к арендатору, и возвращает баланс и идентификатор арендатора.
Я хочу использовать набор записей, который он возвращает с запросом, и мне нужно связать его с идентификатором арендатора.
Это мой текущий запрос:
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
Я также хотел бы добавить баланс из хранимой процедуры.
Как я могу это сделать?
Ответы
Ответ 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