Sql server 参数化SQL语句
我尝试使用一个简单的插入查询来填充SQL表。目前,我的脚本通过连接字符串创建查询,但我希望参数化查询以避免出现以下错误: 使用“0”参数调用“ExecuteOnQuery”时出现异常:“字符串或二进制数据将被截断。” 目前我正在设置连接,如下所示: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
$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中。它应该会引发相同的错误。