将T-SQL结果行写入单个文件

时间:2017-04-25 20:28:20

标签: sql-server ssms

我正在开发一种专有数据仓库产品,该产品具有一个元数据表,其中包含用于填充它的SQL查询。我需要从元数据表中提取每个查询并将其保存到自己的.sql文件中,该文件根据它填充的表命名。

这些查询大约有400个,我想自动化它,但我不知道这样做的好方法。有没有一种很好的方法可以逐行迭代结果集,并将输出写入文件?

我正在尝试做的一个例子。假设我在结果集中返回了两行:

select tableName, extractQuery from packages;

  

tableName extractQuery

     

表1从sourceTable1中选择*;

     

表2从sourceTable2中选择*;

然后我需要将它保存到两个不同的文件Table1.sql和Table2.sql中,每个文件都包含返回的SQL命令。

2 个答案:

答案 0 :(得分:0)

扩展@Andrew O'Brien的SSIS和脚本建议:

步骤1:创建SSIS包。

第2步:添加数据流

第3步:添加SQL源

步骤4:添加脚本组件

内部SQL组件:

选择转化

检查您的2列作为输入

编辑脚本:将其粘贴在那里:

    //This is the path to where you want the results stored
    string filePath = @"\\server\path\"; 
    string fileName = Row.tableName.ToString() + ".sql";

    System.IO.File.WriteAllText(Row.extractQuery.ToString(),filePath+fileName);

这应该写出每个文件。

答案 1 :(得分:0)

您可以使用BCP命令和光标执行此操作。

1)确保在运行

之前创建目标文件夹

2)确保command line utilities are enabled

3)确保SqlService帐户可以访问文件夹

declare c cursor for
select tableName from packages

declare @cvar varchar(64)

open c
fetch next from c into @cvar

while @@FETCH_STATUS = 0
begin


DECLARE @OutputFile NVARCHAR(100) ,    @FilePath NVARCHAR(100) ,    @bcpCommand NVARCHAR(1000)

SET @bcpCommand = 'bcp "SELECT extractQuery FROM yourServer.dbo.packages where tableName = '''+ @cvar + '''" queryout '
SET @FilePath = 'C:\test\'
SET @OutputFile = @cvar + '.txt'
SET @bcpCommand = @bcpCommand + @FilePath + @OutputFile + ' -c -t, -T -S'+ @@servername
exec master..xp_cmdshell @bcpCommand

fetch next from c into @cvar

end
close c
deallocate c