TSQL insert exec(@command)

时间:2013-10-21 13:06:29

标签: sql-server tsql

我想知道为什么以下声明不起作用:

insert into #temp (ip, ping) values ('ip', exec xp_cmdshell 'ping ip')

我想获得结果集,我将在一列中使用ip地址并从该服务器ping。上面的查询返回错误:

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'exec'.
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ')'.

提前感谢您的解释。

2 个答案:

答案 0 :(得分:4)

您无法在INSERT语句值列表中执行任何操作。你需要像这样执行:

insert into #temp 
    execute xp_cmdshell 'ping ip'

[这假设#temp表的列结构与xp_cmdshell]的结果集匹配

您还可以创建一个中间临时表,以包含存储过程返回的所有列,然后将您想要的列插入到最终表中。

答案 1 :(得分:2)

嗯,insert ... exec众所周知是不灵活的。首先,它不会使用values条款。更令人讨厌的是,它不支持列列表。表中的列必须与存储过程的输出完全匹配。

使用insert ... exec的唯一方法是:

insert TableName exec(...)
--             ^^^--> no column list!

以下是一个例子:

if exists (select * from tempdb.sys.tables where name like '#temp__%')
    drop table #temp

create table #temp (output varchar(max))
insert into #temp execute xp_cmdshell 'ping pong'
select * from #temp