PowerShell 1 min read

Add Data into SQL Database by PowerShell Script – ExecuteNonQuery with 0 Arguments: Incorrect Syntax Near 'S'

Michael Wu ·

A PowerShell script designed for PST scanning in the file system resulted in a PSObject. When attempting to insert results into a SQL database, an error occurred.

The Problem

The error message: ExecuteNonQuery with 0 arguments: Incorrect syntax near 'S'

The initial code used string concatenation for the SQL query:

foreach ($entry in $pstarray) {
    $cmd.commandtext = "INSERT INTO data (pstdirectory,pstname,pstsize,pstowner,lastwritetime,SSOID,timestamp,pstsize2) VALUES('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')" -f $entry.directory, $entry.name, $entry.length, $entry.owner, $entry.lastwritetime, $entry.SSOID, $stamp, $entry.Length2

    $cmd.executenonquery()
}

The issue occurred when directory paths contained special characters, such as: \\fileServerName\OwnerName\mike's folder

The apostrophe character broke the SQL query. Attempting to escape the character did not resolve the issue:

$directory2 = $entry.Directory -replace "'", "`'"

The Solution

The problem was resolved by implementing a parameterized query:

foreach ($entry in $pstarray) {
    $cmd.CommandText = "INSERT INTO data (pstdirectory,pstname,pstsize,pstowner,lastwritetime,SSOID,timestamp,pstsize2) VALUES (@pstdirectory,@pstname,@pstsize,@pstowner,@lastwritetime,@SSOID,@timestamp,@pstsize2)"
    $cmd.Parameters.Clear()
    $cmd.Parameters.Add("@pstdirectory", $entry.directory)
    $cmd.Parameters.Add("@pstname", $entry.name)
    $cmd.Parameters.Add("@pstsize", $entry.length)
    $cmd.Parameters.Add("@pstowner", $entry.owner)
    $cmd.Parameters.Add("@lastwritetime", $entry.lastwritetime)
    $cmd.Parameters.Add("@SSOID", $entry.SSOID)
    $cmd.Parameters.Add("@timestamp", $stamp)
    $cmd.Parameters.Add("@pstsize2", $entry.Length2)

    $cmd.executenonquery()
}

Critical Step: $cmd.Parameters.Clear() is essential. Without clearing parameters between iterations, you will receive the error: “The variable name ‘@pstdirectory’ has already been declared. Variable names must be unique within a query batch or stored procedure.”