我经常使用,并且可以很容易地在 Internet 上找到用于从命令插入临时表的文档:sp_executesql
insert into #temp (
column1,
column2,
column3
)
exec sp_executesql @myQueryString
但是,我无法找到任何文档,是如何从更新临时表sp_executesql
,例如column2
从存储过程的结果将已经存在的设置为新值。
这可能吗?
我经常使用,并且可以很容易地在 Internet 上找到用于从命令插入临时表的文档:sp_executesql
insert into #temp (
column1,
column2,
column3
)
exec sp_executesql @myQueryString
但是,我无法找到任何文档,是如何从更新临时表sp_executesql
,例如column2
从存储过程的结果将已经存在的设置为新值。
这可能吗?
不能在语句中sp_executesql
直接使用结果集。UPDATE
您需要将结果插入到不同的表变量/临时表/永久表中,然后用于针对#temp
.
您可以直接从代码中访问临时表@myQueryString
。
因此,例如,如果@myQueryString
这UPDATE #temp SET column1 = 2
也可以。
可能但可能不值得。您可以使用 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
很多引号,因此如果出现问题,调试将是一种享受。