2015-02-20 7 views
0

Получил ли значение временной таблицы вызов процедуры хранения? Поскольку @productTable является временной таблицей, могу ли я EXEC [dbo.FindProductTotal] и получить значение в [dbo.updateProductTotal]? Мне кажется, что это не работает. Если нет, есть ли способ получить значение из результата первой временной таблицы из выполнения во второй процедуре магазина? Реальное кодирование более сложное, поэтому я не знаю, как просто делать простые таблицы вставки и обновления. Мне нужно знать, будет ли этот способ кодирования работать для моего реального кодирования.SQL Server: использование временной таблицы

ALTER PROCEDURE dbo.FindProductTotal (@ProductID int) 
AS 

DECLARE @productTable TABLE (subProductID int, productCode varchar(10), productDesc varchar(25), chargeAmt money) 

    insert into @productTable 
    select productID, productCode, productDesc, chargeAmt 
    from product 
    where region='CA' 

--calculate charge here 

    UPDATE @productTable 
    SET chargeAmt = (calculation here) 
    where ProductID = @ProductID 


ALTER PROCEDURE dbo.updateProductTotal (@ProductID int) 
AS 

DECLARE @productTable TABLE (subProductID int, productCode varchar(10), productDesc varchar(25), chargeAmt money) 

EXEC dbo.FindProductTotal @ProductID = 123456 

    UPDATE dbo.Manufacture 
    SET productChgAmt = p.chargeAmt 
    FROM @productTable p 
    WHERE productID = @ProductID 
+0

Те не временные таблицы. Это переменные таблицы. Эти два [существенно отличаются] (http://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server), особенно в отношении сферы охвата. Хотя это будет работать с временными таблицами, я не верю, что переменные таблицы родителя доступны из области ребенка. Я считаю, что вы создаете здесь два разных объекта. –

+0

Да, вы были правы. Это переменные таблиц. Можно ли предложить способ достичь той же цели - вызвать другую процедуру хранения и получить ее ценность? – angelcake

+0

Ну, вы можете использовать фактическую временную таблицу, объявленную в родительском. Кажется немного странным иметь временный объект, который может не существовать в дочернем элементе, поэтому вы можете проверить это. Или вы можете передать [table-valued parameter] (https://msdn.microsoft.com/en-us/library/bb510489.aspx) дочерней процедуре, а затем вывести ее обратно родительскому элементу во второй переменной таблицы определяется как выход. Честно говоря, я вообще не написал такую ​​процедуру; Я достаточно хорошо знаком с переменными таблицы, чтобы знать, что ваш метод не будет работать. Есть много способов сделать это, просто не это! –

ответ

0
CREATE PROCEDURE dbo.FindProductTotal (@ProductID int) 
AS 
    IF SELECT OBJECT_ID('tempdb..##productTable') IS NULL 
    DROP TABLE ##productTable 

    CREATE TABLE ##productTable(subProductID int, productCode varchar(10), productDesc varchar(25), chargeAmt money) 

    --DECLARE @productTable TABLE (subProductID int, productCode varchar(10), productDesc varchar(25), chargeAmt money) 

    insert into ##productTable 
    select productID, productCode, productDesc, chargeAmt 
    from product 
    where region='CA' 

--calculate charge here 

    UPDATE ##productTable 
    SET chargeAmt = (calculation here) 
    where ProductID = @ProductID 


CREATE PROCEDURE dbo.updateProductTotal (@ProductID int) 
AS 

EXEC dbo.FindProductTotal @ProductID = 123456 

    UPDATE dbo.Manufacture 
    SET productChgAmt = p.chargeAmt 
    FROM ##productTable p 
    WHERE productID = @ProductID 
+0

Спасибо всем. Пример выше работает! – angelcake

+1

@angelcake, что произойдет, если SP, вызываемый одновременно несколькими пользователями? Я думаю, что это не решит проблему, если вы собираетесь использовать этот SP для веб-приложения. –

+0

@selvaTS, когда первые вызовы sp, temp db отпадет, если он существует, и если второй sp вызывает, он будет использовать временную таблицу, созданную первым sp ... Я уверен, что это лучший способ, но у меня нет любая идея о структуре db, я просто заставляю ее работать ... –

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