2014-02-24 4 views
0
는 I 입력 파라미터 @Instring이 VarChar = '1,2,3,4', 동적 입력하여 실행하는 순서가 같은 테이블 @RetTable 채워

:피벗 @Table 동적 SQL은

myDates  myReturns ID 
2012-05-02 0.020  1 
2012-05-03 -0.017  1 
2012-05-04 -0.026  1 
2012-05-02 0.009  2 
2012-05-03 0.004  2 
2012-05-04 -0.003  2 
2012-05-02 -0.003  3 
2012-05-03 -0.005  3 
2012-05-04 -0.003  3 
2012-05-02 0.004  4 
2012-05-03 0.010  4 
2012-05-04 -0.021  4 

나는 다음과 같이하기 위해 ID 열이 표를 돌리고 싶어 :

myDates  1  2  3  4 
2012-05-02 0.020 0.009 -0.003 0.004 
2012-05-03 -0.017 0.004 -0.005 0.010 
2012-05-04 -0.026 -0.003 -0.003 -0.021 
피벗에 내 코드는 순간 다음과 같습니다

:

Select * From @ReturnsTable 
Pivot(Max(myReturns) For [ID] In ([1],[2],[3],[4])) As myPTable 
코드의3210

이 부분은 :

([1],[2],[3],[4])) 

나는 동적 절차를하기 위해 여기 @InString 참조하는 /로 교체하고자합니다. 스택에 다양한 동적 SQL 게시물을 시도했지만 다른 모든 시도에서 문제가 발생합니다. 어떤 아이디어?

편집 :

@bluefeet에 대한 답변. 나는 무엇을 시도했다.

1)

Execute 
('Select * From @TempTable 
Pivot(Max(myReturns) For ID In (' + @InString + ')) As myPTable') 

결과 : 오류 @TempTable 선언해야 -

2) 다음에 #TempTable @TempTable 변경 범위 밖 테이블; 인쇄로 : 잘못된 구문 가까운 '1'ID의이 [1], [2], [3으로 구분해야한다고 생각하는 날 리드

: 그 실행하면

Select * From #TempTable 
Pivot(Max(myReturns) For ID In (1,2,3)) As myPTable 

, 나는 오류 수 ] ..

는 이전 또한 실행 정상으로 실행했지만, 한 또한 Exec에서 sp_executesql을

+0

잘못된 구문을 반환하는 두 번째 시도 - 열이 숫자이므로 각 열을 대괄호로 묶어야합니다 (예 :'[1], [2], [3]') – Taryn

답변

2

declare @sql nvarchar(1000) = 'Select * From @ReturnsTable Pivot(Max(myReturns) For [ID] In (' 
    + @InString+ ') As myPTable' 

exec sp_executesql @sql 
을하려고하면

당신의 @returnsTable이 코드의 범위에 있기 때문입니다

작동하지 않습니다, 그리고 동적 SQL은 다른 범위에있을 것입니다. 테이블 변수를 동적 SQL에 전달하려면 정의 된 유형으로 만들고이를 매개 변수로 전달해야합니다. 당신이 테이블 변수 대신 임시 #table를 사용할 수있는 경우

using Table variable with sp_executesql

를 참조, 동적 SQL 작동합니다.당신은 당신이 올바른 쿼리를 실행되었는지 확인 첫째 있도록

+0

I # 테이블을 사용할 수 있습니다. – Allstar

+0

#Table을 사용하여 @Instring의 괄호 사이에있는 모든 것을 구분하는 작은 함수를 작성한 다음 동적 SQL이 작동합니다 – Allstar

1
DECLARE @InString varchar(50)='1,2,3,4' 

사용 Print 문을 동적

PRINT 
'Select * From @ReturnsTable 
Pivot(
Max(myReturns) 
For [ID] In (' + @InString+ ') As myPTable' 

출력

 
Select * From @ReturnsTable 
Pivot(
Max(myReturns) 
For [ID] In (1,2,3,4) As myPTable 

당신은 확실히 인쇄는 EXECUTE

를 사용하여 올바른 실행되는 경우
EXECUTE(
'Select * From @ReturnsTable 
Pivot(
Max(myReturns) 
For [ID] In (' + @InString+ ') As myPTable' 
)