2017-11-16 2 views
0

다른 열 이름을 사용하여 동적 SQL 쿼리에서 생성 된 임시 테이블은 데이터에 따라 다릅니다. 하드 코딩 된 열 이름 주어진 임시 테이블을 업데이트 할 때 잘 작동합니다. 내가 변수에 의해 열 이름을 통과 할 때하지만 그렇지 않은 @value가 [스키 전설] 같은 열 이름을 보유하고변수를 통해 열 이름을 제공하여 임시 테이블을 업데이트하는 방법

update #Temp 
set @value = ''' + cast(@TempData as nvarchar(max)) + ''' 
where id = @CUserID 

여기서 일하는 것이 쿼리는 작동하지만

update #Temp 
set [Dusky Legend] = ''' + cast(@TempData as nvarchar(max)) + ''' 
where id = @CUserID 

이 제대로 작동하지 않습니다 내 문제는 내가 변수 이

Declare @MarketID AS NVARCHAR(MAX) = '1.136903880'; 
Declare @UserID AS NVARCHAR(MAX) = '6a309d84-d1c6-434d-b9df-4f96a74da912'; 
declare @TempData as numeric = 1111111111; 
declare @@values as NVARCHAR(MAX) =''; 



DECLARE @colsSelect AS NVARCHAR(MAX); 
DECLARE @colsLoop AS NVARCHAR(MAX); 

DECLARE @query AS NVARCHAR(MAX); 


SELECT @colsSelect = STUFF((SELECT distinct ',' + 
        '00' + ' as ' + QUOTENAME(name) 
from RunnersInfoes AS t where marketID [email protected] 

        FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
        , 1, 1, ''); 


        SELECT @colsLoop = STUFF((SELECT distinct ',' + 
        QUOTENAME(name) 
        from RunnersInfoes AS t where marketID [email protected] 

        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
        , 1, 1, ''); 




        --print @colsLoop 


set @query= 
' 
;with cte 
as 
(
select 
id, ParentId,0 AS Level,Share ,AccountTypeName,FirstName 
from dbo.View_UserProfile 
where View_UserProfile.id = ' + '''' + @UserID + '''' +' 
union all 
select 
t.id, t.ParentId,Level + 1 AS Level,t.Share,t.AccountTypeName ,t.FirstName 
from View_UserProfile t 
inner join cte on t.ParentId = cte.id) 

SELECT ID,AccountTypeName as Type,FirstName as Name, ' + @colsSelect + ' into     #Temp from cte as t 



--exec tempdb..sp_help #Temp 


Declare @CUserID AS NVARCHAR(MAX) 

DECLARE dynamic_cursor CURSOR FOR 
select ID from #Temp 
OPEN dynamic_cursor 

FETCH NEXT FROM dynamic_cursor INTO @CUserID 

WHILE @@FETCH_STATUS = 0 
BEGIN 




declare @pos as numeric = 0 
declare @len as numeric = 0 
declare @value as varchar(255) 

WHILE CHARINDEX('','', ''' + @colsLoop +''', @pos+1)>0 
    BEGIN 
    set @len = CHARINDEX('','', ''' + @colsLoop +''', @pos+1) - @pos 
    set @value = SUBSTRING(''' + @colsLoop +''', @pos, @len) 
    PRINT @value 

    update #Temp set [Dusky Legend] = ''' + cast(@TempData as nvarchar(max)) + ''' where id = @CUserID 





set @pos = CHARINDEX('','', ''' + @colsLoop +''', @[email protected]) +1 
     END  




      --print' + cast(@TempData as nvarchar(max)) +' 

      --update #Temp set [Dusky Legend] =''' + cast(@TempData as nvarchar(max)) + ''' where id = @CUserID 



      FETCH NEXT FROM dynamic_cursor INTO @CUserID 

      END 

      CLOSE dynamic_cursor 
      DEALLOCATE dynamic_cursor 

      select * from #Temp 

      ' 
      execute (@query) 

답변

2

당신은 동적 SQL을 필요로 내 전체 코드에 의해 열 이름을 제공 할 수있는 유일한 방법이있다.

declare @value varchar(64) = '[Dusky Legend]' 
declare @TempData varchar(max) = 'some value' 
declare @CUSerID int = 14 


declare @sql varchar(max) 
set @sql = ' 
update #Temp 
set ' + @value + ' = ' + cast(@TempData as nvarchar(max)) + ' 
where id = ' + cast(@CUserID as varchar(256)) 

print(@sql) 
--exec(@sql) 

사이드 노트, 당신은 당신이하고있는 방법에 따라 글로벌 TEMPTABLE이 필요할 수 있습니다.

+0

이미 전체 코드를 업데이트 중입니다. –

+2

응? 방금 변수로 열을 사용하는 답을주었습니다. – scsimon

관련 문제