【发布时间】:2021-03-12 04:16:36
【问题描述】:
如果之前有人问过这个问题,我深表歉意。在我写这篇文章的时候,我无法在这个网站上找到这种行为。
在 powershell 中使用 Invoke-SQLcmd 时出现不一致。我在用户调用脚本时收到 SQL 连接参数。在这个单一的测试脚本中,我有两个查询。两次调用都使用相同的变量。
这可行并返回数据库的名称。
$ConnectQuery = "SELECT DBName = DB_NAME()"
Invoke-Sqlcmd -ServerInstance $SQLServer -Database $SQLDBName -Username $SQLUsername -Password $SQLPassword -Query $ConnectQuery
这不起作用但不会给我错误但什么也不返回。我检查了变量,它们仍然具有与此查询紧跟前一个查询相同的内容。
$ConnectQuery01 = "SELECT * FROM [dbo].[test.csv]"
Invoke-Sqlcmd -ServerInstance $SQLServer -Database $SQLDBName -Username $SQLUsername -Password $SQLPassword -Query $ConnectQuery01
附加说明:
据我了解 Invoke-Sqlcmd 它是一个模块,它提供 Powershell 访问与命令 shell 命令“sqlcmd”相同的功能。所以我尝试使用“sqlcmd”。在这两种情况下,这些命令都有效并返回了预期的数据数据库名称和作为单个测试行的表内容。
在 SQLcmd 可执行文件中:
这些都可以工作并返回预期的数据。
sqlcmd -S <MyDesktopName> -d test -U "<TestAccountName>" -P "<TestPassword>" -q "SELECT DBName = DB_NAME()"
sqlcmd -S <MyDesktopName> -d test -U "<TestAccountName>" -P "<TestPassword>" -q "SELECT * FROM [dbo].[test.csv]"
在 SSMS 中:
这些都可以工作并返回预期的数据。
SELECT DBName = DB_NAME()
SELECT * FROM [dbo].[test.csv]
以防万一有人问
$PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.1171
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.1171
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
【问题讨论】:
-
你确定
[dbo].[test.csv]里面有数据吗?如果你用SSMS查询同一个用户的表,会得到行吗? -
是的,我使用 SSMS 和 SQLcmd.exe 并且都返回了我在该表中插入的单行数据。
-
好的,我想我已经找到了减轻这种行为的方法。如果我这样做:$MyResult = Invoke-Sqlcmd -ServerInstance $SQLServer -Database $SQLDBName -Username $SQLUsername -Password $SQLPassword -Query $ConnectQuery01