【问题标题】:Stored procedure calling xp_cmdshell as inline procedure存储过程调用 xp_cmdshell 作为内联过程
【发布时间】:2017-12-18 08:46:35
【问题描述】:

我希望在调用 dbo.generate_CSV 过程时,在提供所有参数后,执行另一个包含 xp_cmdshell 的内联存储过程。

由于是关于 bcp 导出,我认为除了使用 xp_cmdshell 之外别无他法。

基本上用户只需调用 generate_CSV 程序即可获得所需的输出。

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
IF EXISTS ( select * from sysobjects where name ='dbo.generate_CSV ' ) 
DROP procedure dbo.generate_CSV 
GO
     CREATE procedure dbo.generate_CSV 
     (
        @dbName varchar(100), 
        @tblName varchar(100),
        @outputPath varchar(100) 
     )

AS

GO

   DECLARE @sql varchar(8000)
   SELECT @sql = 'bcp "select * from @dbName..@tblName"' + ' queryout 
   @outputPath -c -t"; " -r"\n" -T -S localhost' --+ @@servername



--EXEC master..xp_cmdshell @sql

GO

用户只关心执行这个过程。

EXEC dbo.generate_CSV @dbName = '[dbName]', @tblName = 
'[tblName]',@outputPath = '[outputPath]'

所以我的问题是如何在 dbo.generate_CSV 过程中调用 exec xp_cmdshell 以便在执行 generate_CSV 时调用 bcp 复制并获取我们的 CSV 文件。

编辑 1: 当我删除评论并执行此操作时,我收到以下错误...

SQLState = 37000,NativeError = 137 错误 = [Microsoft][SQL Native 客户端][SQL Server]必须声明标量变量“@dbName”。 SQLState = 37000,NativeError = 8180 错误 = [Microsoft] [SQL Native 客户端][SQL Server]无法准备语句。空

【问题讨论】:

  • 你说的 INLINE PROCEDURE 是什么意思?你的问题是什么?
  • 如何在 dbo.generate_CSV 过程中调用 exec xp_cmdshell 以便在执行 generate_CSV 时调用 bcp 复制并获得输出 CSV 文件。
  • 你已经写了所有的东西,你只需要去掉“AS”之后的“GO”并取消注释EXEC
  • 是的,但是我会得到一个错误,即无法准备语句以及需要声明一些变量。
  • 所以您的问题是关于如何将带有 tblName 的变量传递给 xp_cmdshell?使用动态 sql 执行此操作

标签: sql-server stored-procedures inline bcp


【解决方案1】:

您应该以这种方式连接 tblName:

SELECT @sql = 'bcp "select * from ' + @dbName+ '..' + @tblName + '"' + ' queryout 
   @outputPath -c -t"; " -r"\n" -T -S localhost' --+ @@servername

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多