【问题标题】:sp_executesql to update a temp tablesp_executesql 更新临时表
【发布时间】:2014-07-12 17:59:03
【问题描述】:

我经常使用,并且可以很容易地在 Internet 上找到文档,用于从 sp_executesql 命令插入到临时表中:

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

但是,我无法找到任何文档,是如何更新 sp_executesql 中的临时表,例如将已经存在的 column2 设置为结果中的新值存储过程。

这可能吗?

【问题讨论】:

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


    【解决方案1】:

    不能在UPDATE 语句中直接使用sp_executesql 结果集。

    您需要将结果插入到不同的表变量/临时表/永久表中,然后用于针对#temp 进行更新。

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

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

    【讨论】:

    • 好的,正在跟踪。这很不幸,但我会这样做。谢谢。
    【解决方案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    
    

    大量引用,因此如果出现问题,调试将是一种享受。

    【讨论】:

    • 非常聪明。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多