Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否在未安装SQL Server的情况下在Powershell中执行.SQL文件?_Sql Server_Database_Powershell_Sql Server 2012_Sql Scripts - Fatal编程技术网

Sql server 是否在未安装SQL Server的情况下在Powershell中执行.SQL文件?

Sql server 是否在未安装SQL Server的情况下在Powershell中执行.SQL文件?,sql-server,database,powershell,sql-server-2012,sql-scripts,Sql Server,Database,Powershell,Sql Server 2012,Sql Scripts,我需要提供一个powershell脚本,它运行一系列步骤来安装自定义解决方案。其中一个步骤是创建SQL Server数据库并执行.SQL文件以生成架构 问题是,我需要一种在任何机器上执行此操作的方法,无论是否在本地安装了SQL server(它通常在另一台网络机器上)。 此外,我需要避免使用第三方模块,因为我无法强制客户端安装它们 有没有办法做到这一点 更新:自SharePoint 2013安装以来,运行脚本的服务器将安装.NET 4.5。您可以使用PowerShell中的普通.NET类SqlC

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

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

有没有办法做到这一点


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

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

更新:

下面是一个示例,说明如何在不使用SQL特定cmdlet的情况下调用execute 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() $connectionString=”“#在此处设置连接字符串 $connection=New Object-TypeName System.Data.SqlClient.SqlConnection($connectionString) $query=”“#在此处设置sql查询 $command=New Object-TypeName System.Data.SqlClient.SqlCommand($query,$connection) $connection.Open() $command.ExecuteOnQuery()#如果要获取查询的返回值,可以使用其他方法。
$connection.Close()您正在尝试执行一些可能无法执行的操作,这取决于您对“未安装sql”的定义。如果客户机没有安装sql客户机工具,您将根本无法直接与sql server对话

如果您需要在远程计算机上安装sql server,通常在没有管理员权限的情况下无法安装,并且使用管理员权限远程安装仍然很复杂,因为sql server 2012不是为远程安装而设计的—尽管您可以通过远程连接使用CMD处理器执行远程安装(如果您有办法做到这一点,因为这不是标准windows安装中内置的

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

类似以下内容:

#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()
#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()
    }
}
--编辑

从技术上讲,
GO
不是一个T-SQL命令。它是Microsoft SQL工具(Management Studio、isql、osql)识别的批处理结束标记。因此,当您直接执行语句时,它不会被识别。真正的解决方案是消除GO语句,或者将语句拆分为单独的批处理过程(物理或字符串分割(“GO”))

或者使用SQL管理对象,理论上可以处理“Go”语句():

--编辑2

或者,如果您不能使用SQL管理对象,并且您有“GO”语句,那么您可以拆分字符串并使用如下代码:

#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()
#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()
    }
}

您只能在数据库中创建一个模式,因为powershell没有内置的数据库引擎,我认为这是行不通的。您可以尝试连接到sql serveralternatively@Paul是的,SQL Server实例可用,但它可能在本地(不可能)或在另一台网络计算机上(很可能)。问题是,我发现的所有PS cmdlet只有在您尝试运行脚本的位置安装了SQL Server时才起作用。SQL客户端工具随附。NETIRC最旧版本的.Net framework不包含SQL客户端工具。让我进一步解释。powershell脚本将在安装Sharepoint 2013的服务器中执行(因此安装了.NET 4.5)。SQL Server实例很可能位于另一台网络计算机上,但它已经安装,我不需要安装它。我只需要创建一个数据库并从SharePoint计算机执行一个.SQL脚本。在这种情况下,您已经有了答案--您可以通过PowerShell使用sqlcoamnd对象来执行此操作。您有任何关于此问题的示例吗hat?我已经添加了一个示例。很好,它运行了.DB created。现在我需要用所有create table和create proc命令运行一个.sql脚本。问题是,它们被GO语句分割,ExecuteNonQuery()与它们不匹配。是的,问题是SMO只有在安装了sql Server的情况下才可用。