在没有安装SQL Server的情况下在Powershell中执行.SQL文件?

时间:2014-01-09 16:23:38

标签: sql-server database powershell sql-server-2012 sql-scripts

我需要提供一个powershell脚本,它运行一系列步骤来安装自定义解决方案。其中一个步骤是创建SQL Server数据库并执行.sql文件以生成架构。

问题是我需要一种在任何机器上执行此操作的方法,无论是否在本地安装SQL服务器(它通常在另一台网络机器上)。 此外,我需要避免使用第三方模块,因为我无法强制客户端安装它们。

有没有办法做到这一点?

更新:自安装SharePoint 2013以来,运行该脚本的服务器将安装.NET 4.5。

3 个答案:

答案 0 :(得分:7)

您可以使用PowerShell中的普通.NET类SqlConnection和SqlCommand。为此,您不需要安装SQL Server,也不需要安装任何特定的PowerShell模块。只需使用New-Object cmdlet创建对象。

更新

以下是在不使用SQL特定cmdlet的情况下调用执行SQL代码的示例(不添加错误处理):

$connectionString = "" #Set your connection string here
$connection = New-Object -TypeName System.Data.SqlClient.SqlConnection($connectionString)
$query = "" #Set your sql query here
$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($query, $connection)
$connection.Open()
$command.ExecuteNonQuery() #Other methods are available if you want to get the return value of your query.
$connection.Close()

答案 1 :(得分:7)

这样的事情:

#Variables
$sqlServer = "."
$sqlDBName = "master"
$sqlQuery = "CREATE DATABASE test"

# Create the connection string
$sqlConnectionString ="Server = $sqlServer; Database = $sqlDBName; Integrated Security = True"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $sqlConnectionString

#Create the SQL Command object
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection

#Open SQL connection
$SqlCmd.Connection.Open()

#Execute the Query
$ReturnValue = $SqlCmd.ExecuteNonQuery()

- 编辑

技术上GO不是T-SQL命令。它是Microsoft SQL工具(Management Studio,isql,osql)认可的批处理结束标记。这就是为什么当你直接执行语句时,它无法识别。 “真正的”解决方案是消除GO语句,或将语句拆分为单独的批处理过程(物理或string.split(“GO”))

或使用SQL Management Object的备用,理论上可以处理“Go”语句(SqlCommand() ExecuteNonQuery() truncates command text):

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
$SMOServer = New-Object ('Microsoft.SqlServer.Management.Smo.Server')
$SMOServer.ConnectionContext.ConnectionString = $sqlConnectionString
$SMOServer.ConnectionContext.ExecuteNonQuery($sqlQuery)

- 编辑2

或者,如果你不能使用SQL管理对象,你有“GO”语句,那么快速而又脏的是你可以分割字符串并使用如下代码:

#Variables
$sqlServer = "."
$sqlDBName = "master"
$sqlQuery = "CREATE DATABASE test; GO; CREATE DATABASE test2; GO;"

# Create the connection string
$sqlConnectionString ="Server = $sqlServer; Database = $sqlDBName; Integrated Security = True"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $sqlConnectionString

$sqlQuery -split "GO;" | ForEach-Object{
    if($_ -ne "")
    {
        #Create the SQL Command object
        $SqlCmd = New-Object System.Data.SqlClient.SqlCommand

        $SqlCmd.CommandText = $_
        $SqlCmd.Connection = $SqlConnection

        #Open SQL connection
        $SqlCmd.Connection.Open()

        #Execute the Query
        $ReturnValue = $SqlCmd.ExecuteNonQuery()

        #Close the connection
        $SqlCmd.Connection.Close()
    }
}

答案 2 :(得分:0)

您正在尝试做一些可能无法完成的事情,取决于您对“未安装的sql”的定义。如果客户端没有安装sql客户端工具,则根本无法直接与sql server通信。

如果您需要在远程计算机上安装sql server,通常无法在没有管理员权限的情况下执行此操作,并且使用管理员权限远程执行此操作仍然很复杂,因为SQL Server 2012不是为远程安装而设计的 - 虽然您可以通过远程连接使用CMD处理器执行远程安装(如果您有某种方法可以执行此操作,因为这不是内置于标准Windows安装中。

如果sql客户端工具安装在本地计算机上(运行powershell)并且sql server正在远程计算机上运行 - 并且您具有适当权限的数据库登录,则可以实例化SqlCommand对象以执行所有操作你可能需要。