Sql server 参数化SQL语句

Sql server 参数化SQL语句,sql-server,powershell,parameterized-query,Sql Server,Powershell,Parameterized Query,我尝试使用一个简单的插入查询来填充SQL表。目前,我的脚本通过连接字符串创建查询,但我希望参数化查询以避免出现以下错误: 使用“0”参数调用“ExecuteOnQuery”时出现异常:“字符串或二进制数据将被截断。” 目前我正在设置连接,如下所示: $conn=新对象System.Data.SqlClient.SQLConnection $ConnectionString=“服务器=$SQLServer;Database=$SQLDatabase;综合安全=真实;连接超时=0“ $conn.Co

我尝试使用一个简单的插入查询来填充SQL表。目前,我的脚本通过连接字符串创建查询,但我希望参数化查询以避免出现以下错误:

使用“0”参数调用“ExecuteOnQuery”时出现异常:“字符串或二进制数据将被截断。”

目前我正在设置连接,如下所示:

$conn=新对象System.Data.SqlClient.SQLConnection
$ConnectionString=“服务器=$SQLServer;Database=$SQLDatabase;综合安全=真实;连接超时=0“
$conn.ConnectionString=$ConnectionString
$conn.Open()
我的非参数化查询如下所示:

$commandText=“插入服务器(名称、操作系统、注释、操作系统所有者)值(“$myvm”、“$operatingSystem”、“$desc”、“$owner”)”
$command=$conn.CreateCommand()
$command.CommandText=$CommandText
$command.ExecuteNonQuery()

我在其他帖子中看到人们讨论了不同的解决方案,但我不确定最好的方法是什么。

参数化不会解决问题,它只是将问题转移到不同的代码部分


您的
服务器
表的设计使一个或多个字段小于您试图插入的值。首先修复此问题-您对数据大小的假设不正确。

alroc是正确的,因为您看到的错误与数据大小有关;要提供有关参数化的答案,请单击此处这就是我的建议:

function execSQL($sqlQuery) {

try {
    $sqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $sqlConnection.ConnectionString = "Server=$SqlServer; Database=$sqlDB; Application Name=$appName; Trusted_Connection=True"
    $sqlCmd.CommandTimeout = 60
    $sqlCmd.CommandText = $sqlQuery
    $sqlCmd.Connection = $sqlConnection
    $sqlCmd.ExecuteNonQuery()

}
catch [system.exception] {
    "$_ `r`nSQL Servername: $SqlServer" #send to log file
}
finally {
    $SqlConnection.Close()
    $SqlConnection.Dispose()
}

}


$appName = "brief description of what the SQL connection is being used for"

$sqlQuery = @"
INSERT INTO Servers (Name, OS, Notes, OSOwner) 
VALUES(@myvm, @operatingSystem, @desc, @owner)
"@

$sqlCmd = New-Object System.Data.SqlClient.SqlCommand

$sqlCmd.Parameters.AddWithValue("@myvm", $myvm) | Out-Null
$sqlCmd.Parameters.AddWithValue("@operatingSystem", $operatingSystem) | Out-Null
$sqlCmd.Parameters.AddWithValue("@desc", $desc) | Out-Null
$sqlCmd.Parameters.AddWithValue("@owner", $owner) | Out-Null

execSQL $sqlQuery

在连接字符串中提供应用程序名称有助于DBA在审核连接时了解连接是什么。将SQL内容包装在try/catch/finally结构中可以捕获错误,但更重要的是,即使抛出错误,SQL连接也会被清理干净。

Hmm…这正是我最初的想法最后,但并没有发现任何数据在2000多行中被截断。我会仔细查看,谢谢。要调试,请输出
$commandtext
,然后将其复制并粘贴到SSMS中。它应该会引发相同的错误。