2017-12-18 298 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

啊,謝謝你,愚蠢的錯誤。 –