首页 > 解决方案 > 创建一个运行一系列 sqlcmds 的批处理,首先选择一个唯一名称列表,然后选择与每个名称相关的数据并输出到 csv

问题描述

我写了一个批处理文件来执行以下结构的一堆重复行:

sqlcmd "select somedata from table where table.attribute is like 'name'" > name_date.csv

where 是对确定哪些数据与特定命名硬件相关的属性进行过滤。然后我输出到文件,然后为其余的名称重复该行。_date 是从批处理文件中的变量设置的。DBMS 是 SQL 服务器。

这很好用并且可以很好地写出所有文件,这已经节省了时间,但是如果我要在另一个客户数据库上使用该批处理文件来为他们的硬件提取相同的数据,我必须手动更新每次重复批处理中的上述命令及其唯一名称列表。硬件名称可能从几个到数百个不等。我想做的是建立在它之上,因此它对于任何这些名称的列表都很有用,而无需人工干预。

我可以通过使用 select distinct 来隔离该唯一的名称列表,然后为每个循环制作某种循环,将这些唯一值中的每一个依次替换为 sqlcmd 并将每个值输出到一个单独的文件中,所有这些都在同一个批处理文件中,所以用户只需要在没有干预的情况下运行它,这超出了我的范围。

摘要:我想创建一个批处理文件,它运行一系列 sqlcmds,首先选择一个唯一名称列表,然后为每个名称选择与它们相关的某些数据并打印到具有该名称的 csv 文件,然后重复下一个唯一名称等

感谢您抽出宝贵时间,感谢您对进一步学习的任何提示和建议。

标签: sqlsql-serverbatch-file

解决方案


有几种方法可以解决这个问题,具体取决于您的具体情况以及您希望获得的自​​动化程度。由于数据源自数据库,因此可以直接编写 SQL 查询来生成批处理文件的行。

在下面的解决方案中,内部 select 语句从 [table] 中选择 [attribute],并在其周围连接其余命令。这提供了每一行(每行返回一行,即每个属性名称一行)。然后,外部 select 语句中的 STRING_AGG 将多行(行)组合在一起,并用换行符分隔每一行。

declare @bat nvarchar(max);    
select @bat = STRING_AGG(lines.oneLine, char(10))
from (
  select 'sqlcmd "select somedata from table where attribute like ''' +
    [attribute] + '''" > ' +
    [attribute] + '_date.csv' as oneLine
  from [table]
  where [attribute] is not null
  group by [attribute]
) as lines;

从这里,只需将结果复制并粘贴到您的批处理文件中。或者发挥创意并使用 xp_cmdshell 将@bat 写入文件系统。如果将所有这些捆绑到一个脚本中,则可以创建一个运行脚本的 BAT 文件,该脚本会生成 BAT 文件。


推荐阅读