调用xp_cmdshell作为内联过程

时间:2017-12-18 08:46:35

标签: sql-server stored-procedures inline bcp

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

由于是关于bcp export,我认为除了使用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 copy并获取我们的CSV文件。

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

  

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

1 个答案:

答案 0 :(得分:1)

你应该用这种方式连接tblName:

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