2013-08-12 1 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

가 어떤 버전 :

다음 예를 참조하십시오? – Taryn

+1

테이블 이름을 전달한 다음 동적 SQL에서 조작을 수행 할 수 있습니다. 하지만 왜? 성취하려고하는 것은 정말로 무엇입니까? 이 특정 방법으로 문제를 해결하는 방법을 묻는 대신이 질문을해야합니다. –

+0

Microsoft SQL 2005를 사용 중입니다. – sonicbabbler

답변

2

아니, 당신이 그와 같은 매개 변수로 테이블을 전달할 수 없습니다 할 것입니다. 당신은 그러나 귀하의 경우에서 Use Table-Valued Parameters (Database Engine) (SQL 서버 2008까지)

를 사용하여 볼 수 있었다

그러나 당신이 오히려 DECLARE CURSOR (Transact-SQL)를 사용하여보고 할 수 있음을 보인다.

커서 실행은 집합 기반 쿼리보다 성능이 떨어집니다.

다시 @Aaron 버트 랜드의 코멘트

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

첫째, 결과를 저장할 테이블 변수를 선언합니다. 그런 다음 rigth 매개 변수로 SP를 실행하고 이전에 선언 된 테이블 변수에 결과를 저장합니다. 그런 다음이 테이블의 내용을 선택하십시오.

0

또한 this SO 스레드를 살펴 봐야합니다. 또한 OPENXML 쿼리 (표 xml 전달 및 xpath 액세스 각각의 필드 사용)를 살펴 보는 것이 좋습니다. SQL 서버의

Example 1

Example 2

관련 문제