我试图从SQL查询(SQL Server 2005)中读取文本文件,但根本没有运气.我用EXEC和xp_cmdshell尝试了各种各样的东西,但都没有用.这是我试图解决这个问题的一般方法:
CREATE TABLE temp (data varchar(2000));
INSERT temp EXEC master.dbo.xp_cmdshell 'type file.txt';
Run Code Online (Sandbox Code Playgroud)
然后我尝试从临时表中选择数据.我经常搜索,我不知道自己错了什么.救命?
尝试从存储过程中执行xp_cmdshell时,我看到一条错误消息.
在实例上启用了xp_cmdshell .和执行权限被授予给我的用户,但我还是看到了异常.
对象'xp_cmdshell',数据库'mssqlsystemresource',架构'sys'上的EXECUTE权限被拒绝
部分问题是这是一个共享集群,我们在实例上有一个数据库,因此我们没有完整的管理员权限.所以我不能进入并授予权限,什么不是.
我知道这个命令会创建一个目录:
EXEC master.sys.xp_create_subdir 'C:\testing\'
Run Code Online (Sandbox Code Playgroud)
但是如何检查'C:\ testing \'是否存在?
IF EXISTS(...
Run Code Online (Sandbox Code Playgroud) 我一直在网上搜索一下,似乎从XP_CMDSHELL获取结果的唯一方法是将它们存储到临时表中.真的没有更简单的方法吗?
来自专家交流:
不,xp_cmdshell不会从exe返回任何信息.如果您不在master数据库中运行它,则必须使用以下语法.master..xp_cmdshell.您必须授予您的用户在master数据库中执行此过程的权限.您必须让您的exe自己插入信息,因为它无法将信息返回给调用它的进程.
和...
虽然@result只从xp_cmdshell获取返回值,但您可以通过直接插入表中来捕获命令的结果......如下所示:
因人而异...
set nocount on
declare @filepath varchar(255),
@cmd varchar(255),
@rc int
select @filepath = 'c:\temp\'
select @cmd = 'dir ' + @filepath + '~*.tmp'
create table #output (output varchar(255) null)
insert #output exec @rc = master..xp_cmdshell @cmd
select * from #output where output is not null
drop table #output
Run Code Online (Sandbox Code Playgroud) 我使用xp_cmdshell挂起问题.
调用可执行文件,执行其工作并退出.由于exe中的ui提示,它不会挂起.exe根本没有悬挂.exe从任务管理器中的进程列表中消失,并且来自exe的内部日志记录确认它执行了main函数中的最后一行
对xp_cmdshell的调用不会在SQL中返回控件.它挂在那一行(它是批处理的最后一行).杀死这个过程是无效的.它实际上需要重启sql server来摆脱挂起的进程(呃)
挂起仅在第一次运行时发生.只要第一个挂起,对具有相同参数的过程的后续调用就会正常工作并正确退出.重新启动SQL后,第一个后续调用将再次挂起.
如果它有任何区别,我试图从exe接收返回值 - 我的sql过程结束于:
exec @i = xp_cmdshell @cmd; 回来@i;
Activity Monitor报告的进程是停留在等待类型的PREEMPTIVE_OS_PROCESSOPS(其他开发人员看到的)或PREEMPTIVE_OS_PIPEOPS(我在当前测试中看到的)
有任何想法吗?
过去,我在SQL Server中使用xp_cmdshell来调用BCP实用程序,以便在两台Windows机器之间将文本文件导入SQL Server上的表中.这两台计算机位于同一个域,无需密码(因为SQL Server命令使用的是受信任/密码较少的连接).这是通过设置源计算机的目录来完成的,以使文件继承目标计算机所属的组所有权.
我想知道,当使用相同的方法将文本文件从Solaris服务器导入到同一Windows服务器但是在不同的域上时,是否也可以这样做.
以下是我想要执行的存储过程:
DECLARE @CMD VARCHAR(6000), @SystemCode INT;
DECLARE @ResultsFromCommand TABLE(SystemMessage VARCHAR(500));
SELECT @Cmd ='bcp [Destination].dbo.AC_Test in "ftp://10.251.11.10/TestFile.txt" -c -F2 -r\n -t^| -Ssqldevelopment\sqldevelopment -T';
INSERT @ResultsFromCommand EXEC @SystemCode = MASTER.dbo.xp_cmdshell @Cmd;
SELECT * FROM @ResultsFromCommand;
Run Code Online (Sandbox Code Playgroud)
因为无法建立连接,我收到了SQL Native Error 0.
我想知道如果因为上次机器在同一个域上,我只需要放置目录"\ ftpprod\testserver\file.txt",这次域名不同我必须使用"ftp:\ 10.251. 11.10\TestFile.txt",这将使它变得不可能.
我无法找到解决问题的最佳方法,请记住,我愿意接受更好的方法来完成这项任务.
我需要做的是,在我的表中的行值更新后,我需要使用该表中的2个字段作为控制台应用程序的参数.现在我可以通过在表上设置触发器然后使用xp_cmdshell
带参数运行应用程序来实现此目的.但是我需要异步执行此操作,因此我的存储过程在等待控制台应用程序完成时不会挂起.
也许我会以错误的方式解决这个问题.
我正在使用SQL Server 2008
编辑 - Andriy M的答案似乎是目前最好的,但正如评论中所述,我需要一种方法来实现"即时".是否可以从SP或触发器调用作业?或者可能是另一种获得类似结果的方法?
感谢大家的帮助.
编辑 - 我选择他回答下面因为它帮助我找到了更好的解决方案.我最终做的是创建一个工作,只是查询我的表与另一个跟踪更新的行.然后,当我有我需要更新的行时,我使用xp_cmdshell运行我的应用程序与指定的参数.到目前为止,这个解决方案似乎运作顺利.
这是我用来创建.rar
带有密码的文件的代码
DECLARE @source VARCHAR(1000),
@destination VARCHAR(1000),
@Command VARCHAR(1000)
SET @source = 'E:\Temp\testRar.txt'
SET @destination = 'E:\Temp\testRar.rar'
SET @Command = '"C:\Program Files\WinRAR\Rar.exe" a -ep1 -pasd^ad ' +@destination+' '+@source
EXEC MASTER..xp_cmdshell @Command
Run Code Online (Sandbox Code Playgroud)
但是它设置asdad
密码而不是密码asd^ad
,^
符号将被忽略。为什么?
我试图使用以下查询从Windows内的目录中删除文件,
exec xp_cmdshell 'del "C:\root\sfd_devtracker\'+@deletefile + '"';
Run Code Online (Sandbox Code Playgroud)
当我执行此命令时,它会给出以下错误,
Incorrect syntax near '+'.
Run Code Online (Sandbox Code Playgroud)
在@deletefile
变量中我有我必须删除的文件名.我在这里做错了什么?
我们正在运行 SQL Server 2014。我们希望使用 gMSA 作为 xp_cmdshell 的代理帐户。
我尝试运行以下命令:
EXEC sys.sp_xp_cmdshell_proxy_account 'gmsaNameGoesHere$', ''
Run Code Online (Sandbox Code Playgroud)
但是,它需要密码。
我尝试运行以下命令:
CREATE CREDENTIAL ##xp_cmdshell_proxy_account## WITH IDENTITY = 'gmsaNameGoesHere$'
Run Code Online (Sandbox Code Playgroud)
它运行了!但是,当用户尝试通过代理帐户运行 xp_cmdshell 时,他们会被告知:
消息 15153,级别 16,状态 1,过程 xp_cmdshell,第 3 行 xp_cmdshell 代理帐户信息无法检索或无效。验证“##xp_cmdshell_proxy_account##”凭据是否存在并包含有效信息。
是否可以在 SQL Server 2014 中使用 gMSA 作为 xp_cmdshell 的代理帐户?如果是这样,如何将其设置为代理帐户?
谢谢!
xp-cmdshell ×10
sql-server ×9
sql ×5
bcp ×1
database ×1
directory ×1
sftp ×1
solaris ×1
sqlcmd ×1