我想知道为什么以下声明不起作用:
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 ')'.
提前感谢您的解释。
答案 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