我想要一种将数据库中每个表的前5行从SQL导出到excel电子表格的方法。所需的输出将是一个excel电子表格,其中每个选项卡将是一个与数据库不同的表,包含前5条记录(也是识别哪些选项卡包含哪些表的方法)。
在过去,我使用以下方法对较小的数据库执行此操作(但我正在尝试删除手动过程,因为我需要在几个大型数据库上这样做):
USE Database_Name
GO
SELECT *
FROM sys.Tables
GO
我使用此查询获取数据库中表名的列表,然后运行以下代码以获取同一数据库中这些表的前5行:
DECLARE @sql VARCHAR(MAX)='';
SELECT @sql=@sql+'SELECT TOP 5 * FROM '+'['+SCHEMA_NAME(schema_id)+'].
['+name+']'+';'
FROM sys.tables
EXEC(@sql)
第一个查询和第二个查询以相同的顺序生成表。因此,以前我已经将名称列表复制并粘贴到excel中(从第一个查询开始),为每个表名创建了一个选项卡,然后将前5行(由第二个查询生成)复制并粘贴到这些选项卡中。我觉得这可以用一种更好的方式/被自动化得多。任何帮助或建议都将不胜感激!
发布于 2018-02-15 15:43:16
下面是在powershell中获取每个表中单个csv文件的一种方法:可以将其重写为Python --它只是对invoke-sqlcmd
的调用(这本身就是对sqlcmd.exe
的调用),以获取表列表,然后一个循环将每个表的前5行导出到csv。
$server = # sql instance name here
$database = # database name here
$outputfolder = # can use values of $server and $database if needed
# if $output doesn't exist: new-item -ItemType Directory $outputfolder
# get list of tables in the database
$tables = (invoke-sqlcmd -ServerInstance $server -Database $database -Query "select top 10 '[' + object_schema_name(object_id) + '].[' + name + ']' as [Table] from sys.tables order by object_schema_name(object_id), name;").Table
# loop through the tables, exporting each to an individual csv file
foreach ($table in $tables) {
# Remove [] and . characters from table name for the filename
$filename = $table.Replace('[', '').Replace(']', '').Replace('.', '_')
invoke-sqlcmd -ServerInstance $server -Database $database -Query "select top 5 * from $table;" | export-csv "$outputfolder\$filename.csv" -NoTypeInformation
}
#todo: combine csv files in $outputfolder into a single Excel file.
如果坚持使用powershell,您可能可以使用导出-Excel做一些事情,但我还没有亲自尝试过。
https://stackoverflow.com/questions/48793964
复制相似问题