2015-09-21 36 views
0

我需要運行在一個報告配置表,並輸出結果作爲.csv或.xls文件的所需文件夾與文件名保存的SQL腳本這也在報告配置表中指定。內的表/串並輸出結果運行SQL腳本到文件

表中的一個例子是按照下文用柱A是要創建的所需的文件名和列B包含將被執行的腳本的腳本。

理想我需要一個腳本,我可以拖放到一個存儲過程將運行倒在桌子和出口各行和各創建結果行作爲一個想要的文件夾一個單獨的文件。

我認爲它需要一個遞歸查詢,但我真的不知道從哪裏開始,任何建議或幫助是極大的讚賞。

編輯:所以有人建議我使用SSIS,這可以與現有的工具箱項完成或我需要編寫一個腳本來做到這一點?表中有數百個SQL腳本,因此效率是關鍵!

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Test_Table_PS](
    [File_Name] [nvarchar](100) NULL, 
    [Script_To_Run] [nvarchar](100) NULL 
) ON [PRIMARY] 
GO 

INSERT [dbo].[Test_Table_PS] ([File_Name], [Script_To_Run]) 
VALUES (N'Report_1', N'Select * FROM FRED') 
GO 

INSERT [dbo].[Test_Table_PS] ([File_Name], [Script_To_Run]) 
VALUES (N'Report_2', N'Select * FROM BOB') 
GO 

INSERT [dbo].[Test_Table_PS] ([File_Name], [Script_To_Run]) 
VALUES (N'Report_3', N'Select * FROM DAVE') 
GO 
+0

你應該嘗試使用SSIS。 – Abhishek

+0

@Abhishek這可能是一個好主意!雖然是否可以使用可用的工具箱項目循環遍歷表中的行,或者是否需要腳本化? – ASindleMouat

+0

只有通過腳本任務纔有可能。因爲我覺得你提供的查詢會產生不同數據類型的可變數量的列,所以在這種情況下,將不可能使它們在「Data Flow Task」和「Excel Destination」中工作。如果他們導致相同數量的列的數據類型相同,那麼我想這將是可能的,只要我們在'source' -destination'映射中設置'column'即可。 – Abhishek

回答

0

你會使用WHILE循環或此操作的CURSOR可能是最好的。儘管WHILE循環需要一個ID字段。類似這樣的:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Test_Table_PS](
    [File_Name] [nvarchar](100) NULL, 
    [Script_To_Run] [nvarchar](100) NULL, 
    [Report_ID] INT IDENTITY(1,1) 
) ON [PRIMARY] 
GO 

INSERT [dbo].[Test_Table_PS] ([File_Name], [Script_To_Run]) 
VALUES (N'Report_1', N'Select * FROM FRED') 
GO 

INSERT [dbo].[Test_Table_PS] ([File_Name], [Script_To_Run]) 
VALUES (N'Report_2', N'Select * FROM BOB') 
GO 

INSERT [dbo].[Test_Table_PS] ([File_Name], [Script_To_Run]) 
VALUES (N'Report_3', N'Select * FROM DAVE') 
GO 

DECLARE @SQL NVARCHAR(MAX) 
DECLARE @SCRIPT NVARCHAR(MAX) 
DECLARE @FILENAME NVARCHAR(50) 
DECLARE @ID INT 

SET @ID = 1 

WHILE @ID <= (SELECT MAX(REPORT_ID) FROM [dbo].[Test_Table_PS]) 
    BEGIN 
     SELECT @SCRIPT = SCRIPT_TO_RUN FROM [dbo].[Test_Table_PS] WHERE @ID = REPORT_ID 
     SELECT @FILENAME = FILENAME FROM [dbo].[Test_Table_PS] WHERE @ID = REPORT_ID 

     SET @SQL = 'BCP "'[email protected]+'" QUERYOUT "'[email protected]+'" -T -c -t,' 
     PRINT @SQL 
     EXEC (@SQL) 

     SET @ID = @ID + 1 
    END 

不要忘記添加文件路徑到你的文件名。

+0

謝謝,這對於生成BCP腳本非常有用,但它不能在SQL Server中執行,它需要在命令行中運行。這將有助於組成一個SSIS包,然後在命令提示符下運行這些包。 – ASindleMouat

相關問題