如何使用Powershell执行.sql文件?


74

我有一个 。sql文件。我正在尝试通过Powershell脚本传递连接字符串详细信息并调用.sql文件。

我正在搜寻,并想出一个与相关的cmdlet Invoke-sqlcmd。在尝试查找与SQL相对应的模块时,我的计算机中未找到任何模块。

我是否应该在计算机上安装任何东西(该计算机已经具有SQL Server Management Studio 2008 R2)来获取模块,或者是否有任何简单的方法可以.sql使用Powershell执行文件?

Answers:


93

尝试查看是否存在SQL管理单元:

get-pssnapin -Registered

Name        : SqlServerCmdletSnapin100
PSVersion   : 2.0
Description : This is a PowerShell snap-in that includes various SQL Server cmdlets.

Name        : SqlServerProviderSnapin100
PSVersion   : 2.0
Description : SQL Server Provider

如果是这样的话

Add-PSSnapin SqlServerCmdletSnapin100 # here lives Invoke-SqlCmd
Add-PSSnapin SqlServerProviderSnapin100

那么您可以执行以下操作:

invoke-sqlcmd -inputfile "c:\mysqlfile.sql" -serverinstance "servername\serverinstance" -database "mydatabase" # the parameter -database can be omitted based on what your sql script does.

5
对于SQL Server 2012,此功能的附加功能是使用SqlServerCmdletSnapin110和SqlServerProviderSnapin110进行注册。
MCRohith 2012年

@MCRohith:谢谢您的增值。真正有用的信息
Samselvaprabu 2012年

2
可以肯定的是,仅供参考,许多人偶然发现了这个问题。使用较新版本的SQL,他们有了sqlps。您可以只将Import-Module“ sqlps”
-DisableNameChecking

1
@workabyte您是否阅读过以下答案:stackoverflow.com/a/10923160/520612?;)
CB。

1
PSA:对于PowerShell的较新版本,您可能想尝试一下Imoprt-Module SQLPS,或者Get-Module -List | ? Name -eq sqlps查看是否有一个或多个SQLPS模块可导入。
杰克

43

引用从在MSDN上导入SQLPS模块

从PowerShell管理SQL Server的推荐方法是将sqlps模块导入Windows PowerShell 2.0环境。

因此,是的,您可以使用Add-PSSnapinChristian详细介绍的方法,但是欣赏推荐的sqlps模块方法也很有用。

最简单的情况是假设您拥有SQL Server 2012:sqlps包含在安装中,因此您可以像通过加载其他模块(通常在配置文件中)一样简单地加载该模块Import-Module sqlps。您可以使用来检查模块在系统上是否可用Get-Module -ListAvailable

如果您没有SQL Server 2012,则只需将sqlps模块下载到modules目录中,以便Get-Module / Import-Module可以找到它。奇怪的是,微软并没有使该模块提供下载!不过,乍得·米勒(Chad Miller)友善地打包了必要的文件,并提供了该模块的下载。将其解压缩到您的... Documents \ WindowsPowerShell \ Modules目录下,然后继续进行导入。

有趣的是,模块方法和管理单元方法并不相同。如果加载管理单元然后运行Get-PSSnapin不带-Registered参数,仅显示已加载的内容),您将看到SQL管理单元。另一方面,如果加载sqlps模块Get-PSSnapin将不会显示已加载的管理单元,则Invoke-Sqlcmd仅通过检查管理单元来测试cmdlet的各种博客条目可能会给出错误的否定结果。

2012.10.06更新

有关sqlps模块与sqlps mini-shell与SQL Server管理单元的完整故事,请看一下最近由Simple-Talk.com发布的由两部分组成的面向SQL Server开发人员和DBA的小型系列实用PowerShell。根据一位读者的评论,我在哪里成功地“解开了”这个问题。:-)


3
请注意,您现在可以从MS下载SQLPS模块。使用PowerShellTools.msi,有x86和x64版本。
thomasb

Get-Module -ListAvalable>>正确的命令是Get-Module -ListAvailable
wut-excel

要将PowerShell与SSMS 17或更高版本一起使用,请在PowerShell画廊中使用Install-Module -Name SqlServer
LeBleu

7
if(Test-Path "C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS") { #Sql Server 2012
    Import-Module SqlPs -DisableNameChecking
    C: # Switch back from SqlServer
} else { #Sql Server 2008
    Add-PSSnapin SqlServerCmdletSnapin100 # here live Invoke-SqlCmd
}

Invoke-Sqlcmd -InputFile "MySqlScript.sql" -ServerInstance "Database name" -ErrorAction 'Stop' -Verbose -QueryTimeout 1800 # 30min

4

这是我在PowerShell配置文件中具有的用于加载SQL管理单元的函数:

function Load-SQL-Server-Snap-Ins
{
    try 
    {
        $sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

        if (!(Test-Path $sqlpsreg -ErrorAction "SilentlyContinue"))
        {
            throw "SQL Server Powershell is not installed yet (part of SQLServer installation)."
        }

        $item = Get-ItemProperty $sqlpsreg
        $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)

        $assemblyList = @(
            "Microsoft.SqlServer.Smo",
            "Microsoft.SqlServer.SmoExtended",
            "Microsoft.SqlServer.Dmf",
            "Microsoft.SqlServer.WmiEnum",
            "Microsoft.SqlServer.SqlWmiManagement",
            "Microsoft.SqlServer.ConnectionInfo ",
            "Microsoft.SqlServer.Management.RegisteredServers",
            "Microsoft.SqlServer.Management.Sdk.Sfc",
            "Microsoft.SqlServer.SqlEnum",
            "Microsoft.SqlServer.RegSvrEnum",
            "Microsoft.SqlServer.ServiceBrokerEnum",
            "Microsoft.SqlServer.ConnectionInfoExtended",
            "Microsoft.SqlServer.Management.Collector",
            "Microsoft.SqlServer.Management.CollectorEnum"
        )

        foreach ($assembly in $assemblyList)
        { 
            $assembly = [System.Reflection.Assembly]::LoadWithPartialName($assembly) 
            if ($assembly -eq $null)
                { Write-Host "`t`t($MyInvocation.InvocationName): Could not load $assembly" }
        }

        Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0
        Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30
        Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false
        Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000

        Push-Location

         if ((Get-PSSnapin -Name SqlServerProviderSnapin100 -ErrorAction SilentlyContinue) -eq $null) 
        { 
            cd $sqlpsPath

            Add-PsSnapin SqlServerProviderSnapin100 -ErrorAction Stop
            Add-PsSnapin SqlServerCmdletSnapin100 -ErrorAction Stop
            Update-TypeData -PrependPath SQLProvider.Types.ps1xml
            Update-FormatData -PrependPath SQLProvider.Format.ps1xml
        }
    } 

    catch 
    {
        Write-Host "`t`t$($MyInvocation.InvocationName): $_" 
    }

    finally
    {
        Pop-Location
    }
}

0

与2008 Server 2008和2008 R2

Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100

与2012年和2014年

Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.