sp_executesql更新临时表

时间:2014-07-12 17:59:03

标签: sql-server sql-update sp-executesql

我经常使用,并且可以在互联网上轻松找到插入sp_executesql命令到临时表中的文档:

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

但是,我在查找任何文档时遇到的问题是如何从sp_executesql 更新临时表,例如将已存在的column2设置为新的来自存储过程结果的值。

这可能吗?

2 个答案:

答案 0 :(得分:2)

sp_executesql语句中直接使用UPDATE结果集是不可能的。

您需要将结果插入到另一个表变量/临时表/永久表中,然后使用该表对#temp进行更新。

您可以直接从@myQueryString中的代码访问临时表。

例如,如果@myQueryStringUPDATE #temp SET column1 = 2,这也可以。

答案 1 :(得分:1)

可能但可能不值得。您可以使用openrowset来执行此操作。您可以查看下面的示例:您需要将服务器名称替换为相关服务器。

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

如果你想要一些更有活力的东西,你可以试试这个:

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='+@@SERVERNAME+';database=master;trusted_connection=yes'','  +
    '''exec msdb.dbo.sp_executesql N'''''+@sp_executesqltext+''''''')) a
    inner join #tempt t on t.name = a.name' 

exec sp_executesql @sql

select * from #tempT    

很多引号所以如果事情破裂,这将是一种调试。