2013-08-12 2 views
-1

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

EXEC sp_Proc SELECT * FROM myTable 

Я создал функцию для возврата таблицы, состоящей из одной записи.

ALTER FUNCTION dbo.preEmail 
(
@Num INT, 
@WID INT 
) 
RETURNS 
@Results TABLE 

(
WID char(10), 
Company nchar(50), 
Tech nchar(25), 
StartDate datetime, 
Description varchar(max), 
Address varchar(200), 
Phone varchar(15), 
Status varchar(35) 

) 
AS 
BEGIN 

INSERT INTO @Results 
    (WID, Company, Tech, StartDate, Description, Address, Phone, Status) 

SELECT WID, company, tech, startDate, description, address, phone, status 
FROM wo_tbl 
WHERE Num = @Number AND wid = @WID 


RETURN 
END 
GO 

Дальше У меня есть хранимая процедура, которая отправляет электронное письмо по технологии, которая запланирована в вышеупомянутой записи.

EXEC sp_emailTech @WID, @Company, @Tech, @StartDate, @Description, @Address, @Phone, @Status. 

, но я предпочел бы сделать

EXEC sp_emailTech SELECT * FROM dbo.preEmail(1, 5746) 
+0

какая версия SQL Server? – Taryn

+1

Вы можете передать имя таблицы и выполнить свои операции из динамического SQL. Но почему? Что вы на самом деле пытаетесь достичь? Вы должны задать этот вопрос вместо того, чтобы спрашивать, как решить эту проблему именно этим способом. –

+0

Я использую Microsoft SQL 2005 – sonicbabbler

ответ

2

Нет, вы не можете передать таблицу в качестве параметра, как это.

Вы могли однако смотреть на использовании Use Table-Valued Parameters (Database Engine) (SQL Server 2008 до)

В вашем случае, однако, кажется, что вы могли бы смотреть на использовании DECLARE CURSOR (Transact-SQL) скорее.

Следует ли помнить, что выполнение курсора имеет производительность, связанную с запросами на основе набора.

Re @Aaron Bertrand комментарий

DECLARE @id INT, 
@name varchar(5) 

DECLARE Cur CURSOR FOR 
SELECT * 
FROM myTable 

OPEN Cur 

FETCH NEXT FROM Cur INTO @ID, @Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC sp_Proc @id, @Name 
    FETCH NEXT FROM Cur INTO @ID, @Name 
END 

CLOSE Cur 
DEALLOCATE Cur 
+1

Зачем нужен курсор здесь? Могли бы вы продемонстрировать, как это сделать? –

+0

@AaronBertrand, я добавил пример –

+0

Но как он это делает в хранимой процедуре? Хранимая процедура не знает имя таблицы, в которой есть данные, которые необходимо обработать с помощью ... –

0

Во-первых, объявить табличную переменную для хранения результата. Затем выполните SP с параметрами rigth и сохраните результат в предыдущей объявленной переменной таблицы. Затем выберите содержимое этой таблицы.

0

Вы также должны обратить внимание на this. Кроме того, я бы порекомендовал вам взглянуть на запрос OPENXML (передать в таблицу xml и использовать xpath для доступа к соответствующему полю).

Смотрите следующие примеры:

Example 1

Example 2

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