我有一个.sql
文件,里面有多个存储过程和函数脚本。
我不想使用Invoke
命令,因为我的服务器不支持它们。
目前我正在使用下面的代码,如果我的.sql
文件只有一个存储过程或函数,它可以正常工作。
$scriptDetail = Get-Content $sqlScriptLocation | Out-String
$scriptDetail = $scriptDetail -creplace 'GO',''
$scriptDetail = $scriptDetail -replace 'SET ANSI_NULLS ON',''
$scriptDetail = $scriptDetail -replace 'SET QUOTED_IDENTIFIER ON',''
$ConnectionString = “Server=$dataSource;uid=$user; pwd=$cred;Database=$database;”
$sqlCon = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $ConnectionString
$sqlCon.Open()
$sqlCmd = New-Object -TypeName System.Data.SqlClient.SqlCommand
$sqlCmd.Connection = $sqlCon
$sqlCmd.CommandText = $scriptDetail
$sqlCmd.ExecuteNonQuery()
$sqlCon.Close()

我正在替换上面代码中的GO
和其他两个命令,因为它们会导致像
System.Data.SqlClient.SqlException(0x80131904):' GO'附近的语法不正确
System.Data.SqlClient.SqlException(0x80131904):'创建功能'必须是查询批处理中的第一个语句
必须声明标量变量" @ variableName"
答案 0 :(得分:0)
我已经想出了一些挖掘后的解决方案,读取完整的文件并将其放入一个数组中然后运行ForEach循环,它将获得ForEach循环中的每一行,如果它不等于" GO"将它添加到另一个数组else数组(在其中添加每一行)执行它 代码如下
$SQLConnection = New-Object System.Data.SqlClient.SqlConnection
$SQLConnection.ConnectionString = "Server=" + $YourServerName + ";Database=" + $YourDatabaseName + ";User ID= " + $YourUserName + ";Password=" + $YourDbPassword + ";"
$DirectoryPath = "C:\FolderName"
$Dep_SqlFiles = get-childitem -Recurse $DirectoryPath -Include "*.sql"
$Dep_Info_DataEntry = @(Get-Content $Dep_SqlFiles.FullName) #Get all info of each file and put it in array
foreach($SQLString in $Dep_Info_DataEntry)
{
if($SQLString -ne "go")
{
#Preparation of SQL packet
$SQLToDeploy += $SQLString + "`n"
}
Else
{
try{
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($SQLToDeploy, $SQLConnection)
$SQLCommand.ExecuteNonQuery()
#use this if you want to log the output
#$SQLCommand.ExecuteScalar() | Out-File YourLogFile -Append
}
Catch
{
}
$SQLToDeploy = ""
}
}