2014-07-12 2 views
1

내가 자주 사용하는 임시 테이블을 업데이트하고, 쉽게 sp_executesql 명령에서 임시 테이블에를 삽입 위해 인터넷에서 문서를 찾을 수 있습니다, 그러나sp_executesql을은

insert into #temp (
    column1, 
    column2, 
    column3 
) 
exec sp_executesql @myQueryString 

나는 문제 중 하나를 찾는 데 무엇을 에 대한 설명서는 sp_executesql에서 이미 존재하는 column2을 저장 프로 시저의 결과에서 새로운 값으로 설정하는 것과 같은 임시 테이블을 업데이트하는 방법입니다.

이것이 가능합니까?

답변

2

UPDATE 문에서 sp_executesql 결과 집합을 직접 사용할 수 없습니다.

#temp에 대한 업데이트를 수행 할 때 사용하는 다른 테이블 변수/임시 테이블/영구 테이블에 결과를 삽입해야합니다.

@myQueryString의 코드에서 직접 임시 테이블에 액세스 할 수 있습니다.

예를 들어 @myQueryStringUPDATE #temp SET column1 = 2 인 경우이 방법도 사용할 수 있습니다.

+0

좋아, 추적. 그건 불행한 일이지만, 그렇게 할거야. 감사. – dthree

1

가능하지만 그만한 가치는 없습니다. openrowset을 사용하여이를 수행 할 수 있습니다. 아래 예를 볼 수 있습니다. 서버 이름을 해당 서버로 바꿔야합니다. 이 일을 어기면 디버깅하는 치료 될 수 있도록 인용

drop table #tempT 
create table #tempT 
(
    name sysname 

) 

insert into #tempT 
values ('backupmediafamily') 

select * from #tempT 
declare @sp_executesqltext nvarchar(max) = 'select * from sys.tables where name like ''%backup%'' ' 
select @sp_executesqltext = replace(@sp_executesqltext,'''','''''''''') 
declare @sql nvarchar(max) 
set @sql = 'update t 
      set name = ''new'' 
      from (' + 
    'SELECT * FROM OPENROWSET(''sqloledb'', ''server='[email protected]@SERVERNAME+';database=master;trusted_connection=yes'',' + 
    '''exec msdb.dbo.sp_executesql N'''''[email protected]_executesqltext+''''''')) a 
    inner join #tempt t on t.name = a.name' 

exec sp_executesql @sql 

select * from #tempT  

많은 : 당신은 당신이 시도 할 수있는 좀 더 역동적 인 무언가를 원한다면

use master 

go 

drop table #tempT 
create table #tempT 
(
    name sysname 

) 

insert into #tempT 
values ('backupmediafamily') 

select * from #tempT 
update t 
set name = 'new' 
from (SELECT * FROM OPENROWSET('sqloledb', 'server=YourServerName;database=master;trusted_connection=yes','exec msdb.dbo.sp_executesql N''select * from sys.tables''')) a 
inner join #tempt t on t.name = a.name 

select * from #tempT 

.

+0

매우 영리합니다. 고맙습니다. – dthree