2017-12-18 291 views
0

我希望在调用dbo.generate_CSV过程后,在提供所有参数之后,包含要执行的xp_cmdshell的另一个内联存储过程。调用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 @[email protected]"' + ' 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错误= [微软] [SQL本机客户端 ] [SQL服务器]必须声明标量变量“@dbName”。 SQLState = 37000,NativeError = 8180错误= [Microsoft] [SQL本机 客户端] [SQL Server]无法准备声明。 NULL

+0

你怎么说INLINE程序是什么意思?和你的问题是什么? – sepupic

+0

如何在dbo.generate_CSV过程中调用exec xp_cmdshell,以便在执行generate_CSV时调用bcp副本并获取我们的输出CSV文件。 –

+1

你已经写完了所有的东西,你所需要的只是在“AS”之后摆脱“GO”并取消注释EXEC – sepupic

回答

1

你应该串联tblName这样:

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

啊,谢谢你,愚蠢的错误。 –