在SQL中插入日期

Sil*_*bob 0 powershell

我指定了以下日期时间:

$dateChanged = Get-Date -Format ("yyyy-MM-dd hh:mm:ss.fff")
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO myTable (name, dateChanged) VALUES ($name, $dateChanged);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

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

我尝试重新格式化dateChanged变量无济于事.

Jer*_*ert 6

您可以通过简单的字符串替换在PowerShell中完全执行SQL,就像您可以传递给的"参数"一样Invoke-Sqlcmd.我建议你不要这样做:它让你开放注射,你必须特别注意格式化日期,NULL值,浮点值,字符串...这里有两个函数可以帮助你以.NET方式执行:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

样品用途:

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
    }
Run Code Online (Sandbox Code Playgroud)

这不是完美的(你可以使用正确的cmdlet,AddWithValue有问题),你可能会认为它对于一次性查询来说是过度杀伤,但它仍然比构建文本替换更好.