1

我使用 SQL Server 2008。目前我正在处理一个需要(除其他外)打印文件的存储过程。

问题:我在sp中创建的文本文件需要打印为横向。我使用了一个程序 DOSPrinter.exe,它是一个通用打印机驱动程序,它从命令行向(默认)打印机提示添加一个文件。

我使用 xp_cmdshell 来执行此操作。我猜 xp_cmdshell 有足够的权限。我用它来执行一些文件复制操作,在我为使用的目录设置安全性之后,它可以完美地工作。

我给了 DOSPrinter 和打印设备一样的权限。

但是,当在命令窗口中手动键入命令 (C:\temp\DOSPrinter "C:\temp\test.txt") 时,文件会出现在打印提示中。当我将相同的命令放入 bat 文件并从 cmd 窗口手动调用 bat 文件时,该文件将发送到打印提示。

当我尝试将命令放在存储过程中时:

    SET @bcpCommand = 'C:\temp\DOSPrinter.exe C:\temp\test.txt'
    EXEC master..xp_cmdshell @bcpCommand

该文件未发送到打印提示。如果我尝试从 sp 调用 bat 文件,打印提示中也没有文件。我有点绝望

也许有人可以帮我给我一些关于如何进行的想法?

谢谢,

jan_solo

4

3 回答 3

0

我有一个周末来考虑它,答案实际上比我预期的要简单......

关键是通用打印机驱动程序将文本文档发送到默认打印机,正如我所指出的。XP_cmdshell 在与我登录时不同的用户下执行。

我唯一要做的就是在打印文件之前用 XP_cmdshell 添加一个默认打印机:

    SET @bcpCommand = 'rundll32 printui.dll,PrintUIEntry /y /q /n "My_Printer"'
    EXEC master..xp_cmdshell @bcpCommand

    SET @bcpCommand = 'C:\temp\DOSPrinter.exe C:\temp\test.txt'
    EXEC master..xp_cmdshell @bcpCommand

当我运行存储过程时,文件确实出现在打印提示中。

大家,无论如何都感谢您的答案:-)

于 2013-01-07T09:00:25.370 回答
0

您是否尝试过在 SSMS 窗口而不是命令窗口中运行命令?我不认为问题在于存储过程本身。我认为问题是 SQL Server 访问可执行文件和/或文件。

现在,一个愚蠢的问题。您是否在运行 SSMS 的同一台计算机上运行 SQL Server?如果没有,问题很简单。该命令在您的本地计算机上,但不在服务器计算机上。

如果您在同一台机器上运行所有程序并且您知道 xp_cmdshell 正在工作,那么问题就会变得更加困难。这可能是权限问题的委托。可能是运行 SQL Server 代理的用户没有查看临时文件的权限。或者可能有其他原因。

祝你好运。

于 2013-01-04T16:12:55.123 回答
0

确保该功能已启用:

exec sp_configure ‘show advanced options’, 1
go
reconfigure
go
exec sp_configure ‘xp_cmdshell’, 1
go
reconfigure
go

如果是,您可以发布命令发送给您的输出吗?如果你尝试跑步会发生什么dir *.*

于 2013-01-04T16:00:04.770 回答