Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在Powershell中调用sqlcmd时,如何指定区域/语言/区域性设置?_Sql Server_Powershell_Datetime_Invoke Sqlcmd - Fatal编程技术网

Sql server 在Powershell中调用sqlcmd时,如何指定区域/语言/区域性设置?

Sql server 在Powershell中调用sqlcmd时,如何指定区域/语言/区域性设置?,sql-server,powershell,datetime,invoke-sqlcmd,Sql Server,Powershell,Datetime,Invoke Sqlcmd,在SQLServerManagementStudio中执行返回日期时间的函数(如GETDATE())时,输出将在用户的“区域性”(区域/语言设置)中格式化。 但是,当在Powershell中通过Invoke-Sqlcmdcmdlet执行相同的查询时,输出的格式为US-date格式(我假设为不变区域性)。 其他cmdlet,如Get Date返回当前区域性中的日期时间 如何确保Invoke Sqlcmd的输出符合当前区域性设置 要演示的最小代码示例 $result = Invoke-Sqlcmd

在SQLServerManagementStudio中执行返回日期时间的函数(如
GETDATE()
)时,输出将在用户的“区域性”(区域/语言设置)中格式化。 但是,当在Powershell中通过
Invoke-Sqlcmd
cmdlet执行相同的查询时,输出的格式为US-date格式(我假设为不变区域性)。 其他cmdlet,如
Get Date
返回当前区域性中的日期时间

如何确保
Invoke Sqlcmd
的输出符合当前区域性设置

要演示的最小代码示例

$result = Invoke-Sqlcmd -query "select GETDATE() as datetime" -ServerInstance ...
$now = Get-date -format "yyyy-MM-dd HH:mm:ss"
if ( $result.datetime -eq $now) {
  Write-output "ok"
} else {
  Write-warning "dates mismatch '$($result.datetime)' should be '$now'"
}

警告显示以US格式显示的第一个datetime,以及以指定格式显示的第二个datetime

$result。datetime
的类型为
datetime
,而
$now
的类型为
string
。这就是为什么您的比较和输出不能按预期工作的原因。您可以不将当前日期转换为字符串:

。。。
$now=获取日期
如果($result.datetime-eq$now){
...
但请记住,然后将使用毫秒的精度比较这两个值。根据格式字符串,我假设您只需要秒的精度。然后可以执行以下操作:

。。。
$now=获取日期
$format='yyyy-MM-dd HH:MM:ss'
if($result.datetime.toString($format)-eq$now.toString($format)){
...

您应该对脚本执行ifx操作,以便在使用日期或数字时不使用特定于语言环境的文字。
GetDate()
没有格式-它只是一个强类型的二进制日期时间值。您是否正在将其转换为字符串?如果使用
INSERT-INTO-MyTable(mycl)值(GetDate()),请发布脚本
locale不重要。如果您改为编写
EXEC'INSERT…'+GETDATE()+'..'
您有一个bug。如果区域设置发生更改,脚本将失败,并且容易受到许多其他问题的攻击,包括SQLinjection@PanagiotisKanavos:我不是用它来插入。脚本的目的是验证自定义函数是否正确返回当前日期时间。您完全正确地认为该函数(如
GETDATE()
)返回System.DateTime对象。格式化发生在写入警告调用中,该调用显示结果和预期值(作为字符串传递给函数)。如果您将第一条注释作为答案发布,我将接受。谢谢@Thomas。我将尽快测试(这可能需要一段时间,现在正在处理一些其他优先事项)并将接受您的答案或提供反馈!