PowerShell调用Invoke-Sqlcmd获取数据库用户名报FileNotFoundException错误求助
PowerShell调用Invoke-Sqlcmd报FileNotFoundException的解决方法
报错根本原因
该错误是当前PowerShell环境缺失SqlServer官方PowerShell模块,或旧版SQL Server组件依赖不完整导致的,另外你提供的原代码也存在参数填写错误的问题。
解决步骤
方案1:使用官方Invoke-Sqlcmd(需要安装模块)
- 以管理员权限启动PowerShell,执行以下命令检查是否已安装SqlServer模块:
Get-Module -ListAvailable SqlServer
如果没有返回任何模块信息,执行安装命令:Install-Module -Name SqlServer -Force -AllowClobber
如果提示不受信任的仓库,输入Y确认继续即可,离线环境可以提前下载模块包拷贝到$env:PSModulePath对应的目录下完成安装。 - 验证模块安装成功,执行导入命令无报错即可:
Import-Module SqlServer - 修正原代码的参数错误:原参数
-ServerInstance的格式应为「服务器地址\实例名」,不能直接拼接数据库名,数据库需要单独通过-Database参数指定,修正后的完整代码如下:
$query = "select * from sys.database_principals" # 替换对应参数的实际值,如需账号密码登录可增加 -Username、-Password 参数 $databases = Invoke-Sqlcmd -Query $query ` -ServerInstance "你的服务器名\你的SQL实例名" ` -Database "你的目标数据库名" ` -SuppressProviderContextWarning # 转换为DataTable格式 $resultDataTable = $databases | ConvertTo-DataTable
方案2:无依赖原生实现(不需要安装任何模块)
如果不想额外安装模块,可以直接调用.NET内置的SQLClient类实现查询,零依赖:
# 替换为实际的数据库连接串,如需账号密码登录修改连接串配置即可 $connectionString = "Server=你的服务器名\实例名;Database=你的目标数据库名;Integrated Security=True;" $query = "select * from sys.database_principals" $resultDataTable = New-Object System.Data.DataTable $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) try { $connection.Open() $command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) $adapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) $adapter.Fill($resultDataTable) | Out-Null } finally { $connection.Close() $connection.Dispose() }
执行完成后直接使用$resultDataTable即可获取查询结果的DataTable对象。
内容的提问来源于stack exchange,提问作者Lily
相关产品推荐
相关产品推荐

