在表/字符串中运行SQL脚本并将结果输出到文件

时间:2015-09-21 09:38:52

标签: sql sql-server recursion ssis-2012

我需要运行报表配置表中保存的SQL脚本,并将结果作为.csv或.xls文件输出到所需文件夹中,文件名也在报表配置表中指定。

该表的一个示例如下面的脚本所示,其中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

1 个答案:

答案 0 :(得分: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 "'+@SCRIPT+'" QUERYOUT "'+@FILENAME+'" -T -c -t,'
        PRINT @SQL
        EXEC (@SQL)

        SET @ID = @ID + 1
    END

不要忘记将文件路径添加到文件名中。