1

我想知道为什么下面的语句不起作用:

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 ')'.

提前感谢您的解释。

4

2 回答 2

4

您不能执行INSERT语句值列表中的任何内容。你需要像这样执行:

insert into #temp 
    execute xp_cmdshell 'ping ip'

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

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

于 2013-10-21T13:09:49.167 回答
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
于 2013-10-21T13:14:23.483 回答