在SQL中插入日期

时间:2018-05-29 10:30:03

标签: powershell

我指定了以下日期时间:

$dateChanged = Get-Date -Format ("yyyy-MM-dd hh:mm:ss.fff")

我想使用以下PowerShell将其插入到SQL datetime字段中:

INSERT INTO myTable (name, dateChanged) VALUES ($name, $dateChanged);

我收到以下错误:

  

异常调用" ExecuteNonQuery"用" 0"参数:"' 11'附近的语法不正确。"

注意:这里的当前时间是11:28。

我尝试重新格式化dateChanged变量无效。

1 个答案:

答案 0 :(得分:6)

你可以通过简单的字符串替换在PowerShell中完成SQL,比如"参数"你可以转到Invoke-Sqlcmd。我建议你不要:它让你开始注射,你必须特别注意格式化日期,function ConvertFrom-DataReader($datareader) { $values = New-Object Object[] $datareader.FieldCount $names = New-Object string[] $datareader.FieldCount $anyNameEmpty = $false for ($i = 0; $i -lt $values.Length; $i++) { $names[$i] = $datareader.GetName($i) if (-not $names[$i]) { $anyNameEmpty = $true } } while ($datareader.Read()) { $v = $datareader.GetValues($values) if ($anyNameEmpty) { Write-Output $values } else { $result = New-Object psobject for ($i = 0; $i -lt $v; $i++) { Add-Member ` -InputObject $result ` -MemberType NoteProperty ` -Name $names[$i] ` -Value $values[$i] } Write-Output $result } } } function Invoke-SqlCommand( [string] $ConnectionString, [string] $CommandText, [hashtable] $Parameters = @{} ) { $connection = New-Object System.Data.SqlClient.SqlConnection($ConnectionString) try { $connection.Open() $command = New-Object System.Data.SqlClient.SqlCommand $command.Connection = $connection $command.CommandText = $commandText $command.CommandType = [System.Data.CommandType]::Text foreach ($Name in $Parameters.Keys) { $command.Parameters.AddWithValue($Name, $Parameters[$Name]) | Out-Null } ConvertFrom-DataReader $command.ExecuteReader() } finally { $connection.Close() } } 值,浮点值,字符串......这里有两个函数,帮助你以.NET的方式做到这一点:

Invoke-SqlCommand `
    -ConnectionString "Data Source=(localdb)\mssqllocaldb" `
    -CommandText "DECLARE @myTable TABLE(name VARCHAR(100), dateChanged DATETIME); 
        INSERT INTO @myTable (name, dateChanged) VALUES (@name, @dateChanged);
        SELECT * FROM @myTable" `
    -Parameters @{
        name = "Winston"
        dateChanged = Get-Date
    }

样品使用:

{{1}}

这不是完美的(您可以使用正确的cmdlet,AddWithValue has issues)并且您可能会认为它对于一次性查询来说是过度杀戮,但构建它仍然比文本替换要好得多