我想要一种将数据库中每个表的前 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 行(由第二个查询生成)复制并粘贴到这些选项卡中。我觉得这似乎可以以更好的方式/自动化来完成。任何帮助或建议将不胜感激!
最佳答案
以下是在 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,你也许可以使用 Export-Excel 做一些事情。但我自己还没有尝试过。
关于sql - 将数据库中每个表的前 5 行导出到 Excel - MS SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48793964/