创建一个运行一系列sqlcmd的批处理,这些sqlcmd首先选择一个唯一名称列表,然后选择与每个名称相关的数据并输出到c



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

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

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

这样做效果很好,可以很好地写出所有文件,这已经节省了时间,但如果我要在另一个客户数据库上使用该批处理文件来为他们的硬件提取相同的数据,我必须手动更新批处理中上述命令的每一次重复,并使用他们的唯一名称列表。硬件名称的总数可能从几个到几百个不等。我想做的是在它的基础上进行构建,这样它就可以在没有手动干预的情况下用于这些名称的任何列表。

我可以通过使用select distinct来隔离这个唯一的名称列表,但我无法为每个循环创建某种循环,将这些唯一的值依次替换为sqlcmd,并将每个值输出到一个单独的文件,所有这些都在同一批处理文件中,因此用户只需在没有干预的情况下运行它。

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

感谢您抽出时间,我非常感谢您为进一步学习提供的任何提示和建议。

有几种方法可以处理这一问题,具体取决于您的具体情况以及您希望实现的自动化程度。由于数据源于数据库,因此编写一个生成批处理文件行的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文件。