运行 SQL table/string 内的脚本并将结果输出到文件

Run SQL Script within a table/string and output results to file

我需要 运行 包含在报告配置中的 SQL 脚本 table 并将结果作为 .csv 或 .xls 文件输出到所需文件夹中的文件也在报告配置中指定的名称 table.

table 的示例如下面的脚本所示,A 列是要创建的所需文件名,B 列包含将要执行的脚本。

理想情况下,我需要一个脚本,我可以将其放入存储过程中,该脚本将 运行 在 table 中的每一行中向下并导出并创建每一行结果作为所需文件夹中的单独文件.

我认为它需要是一个递归查询,但我真的不知道从哪里开始,非常感谢任何建议或帮助。

编辑:有人建议我使用 SSIS,这可以用现有的工具箱项目完成吗,还是我需要编写脚本来完成? table 中有数百个 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

您可能最好使用 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

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