Using the Invoke-Sqlcmd cmdlet
Invoke-Sqlcmd is a SQL Server cmdlet that runs scripts that contain statements from the languages (Transact-SQL and XQuery) and commands that are supported by the sqlcmd utility.
Using Invoke-Sqlcmd
The Invoke-Sqlcmd cmdlet lets you run your sqlcmd script files in a Windows PowerShell environment. Much of what you can do with sqlcmd can also be done using Invoke-Sqlcmd.
This is an example of calling Invoke-Sqlcmd to execute a simple query, similar to specifying sqlcmd with the -Q and -S options:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
This is an example of calling Invoke-Sqlcmd, specifying an input file and piping the output to a file This is similar to specifying sqlcmd with the -i and -o options:
Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"
Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"
This is an example of using a Windows PowerShell array to pass multiple sqlcmd scripting variables to Invoke-Sqlcmd. The "$" characters identifying the sqlcmd scripting variables in the SELECT statement have been escaped by using the Windows PowerShell back-tick "`" escape character:
$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray
$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray
This is an example of using the SQL Server provider to navigate to an instance of the Database Engine, and then using the Windows PowerShell Get-Item cmdlet to retrieve the SMO Server object for the instance and passing it to Invoke-Sqlcmd:
Set-Location SQLSERVER:\SQL\MyComputer\MyInstance
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance (Get-Item .)
Set-Location SQLSERVER:\SQL\MyComputer\MyInstance
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance (Get-Item .)
The -Query parameter is positional and does not have to be named. If the first string that is passed to Invoke-Sqlcmd: is unnamed, it is treated as the -Query parameter.
Invoke-Sqlcmd "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Invoke-Sqlcmd "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Path Context in Invoke-Sqlcmd
If you do not use the -Database parameter, the database context for Invoke-Sqlcmd is set by the path that is active when the cmdlet is called.
Path |
Database Context |
---|---|
Starts with a drive other than SQLSERVER: |
The default database for the login ID in the default instance on the local computer. |
SQLSERVER:\SQL |
The default database for the login ID in the default instance on the local computer. |
SQLSERVER:\SQL\ComputerName |
The default database for the login ID in the default instance on the specified computer. |
SQLSERVER:\SQL\ComputerName\InstanceName |
The default database for the login ID in the specified instance on the specified computer. |
SQLSERVER:\SQL\ComputerName\InstanceName\Databases |
The default database for the login ID in the specified instance on the specified computer. |
SQLSERVER:\SQL\ComputerName\InstanceName\Databases\DatabaseName |
The specified database in the specified instance on the specified computer. This also applies to longer paths, such as a path that specifies the Tables and Columns node within a database. |
For example, assume that the default database for your Windows account in the default instance of the local computer is master. Then, the following commands would return master:
Set-Location SQLSERVER:\SQL
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
Set-Location SQLSERVER:\SQL
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
The following commands would return AdventureWorks:
Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks\Tables\Person.Contact
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks\Tables\Person.Contact
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
Invoke-Sqlcmd provides a warning when it uses the path database context. You can use the -SuppressProviderContextWarning parameter to turn off the warning message. You can use the -IgnoreProviderContext parameter to tell Invoke-Sqlcmd to always use the default database for the login.
Comparing Invoke-Sqlcmd and the sqlcmd Utility
Invoke-Sqlcmd can be used to run many of the scripts that can be run using the sqlcmd utility. However, Invoke-Sqlcmd runs in a Windows PowerShell environment which is different than the command prompt environment that sqlcmd is run in. The behavior of Invoke-Sqlcmd has been modified to work in a Windows PowerShell environment.
Not all of the sqlcmd commands are implemented in Invoke-Sqlcmd. Commands that are not implemented include the following: :!!, :connect, :error, :out, :ed, :list, :listvar, :reset, :perftrace, and :serverlist.
Invoke-Sqlcmd does not initialize the sqlcmd environment or scripting variables such as SQLCMDDBNAME or SQLCMDWORKSTATION.
Invoke-Sqlcmd does not display messages, such as the output of PRINT statements, unless you specify the Windows PowerShell -Verbose common parameter. For example:
Invoke-Sqlcmd -Query "PRINT N'abc';" -Verbose
Invoke-Sqlcmd -Query "PRINT N'abc';" -Verbose
Not all of the sqlcmd parameters are needed in a Windows PowerShell environment. For example, Windows PowerShell formats all output from cmdlets, so the sqlcmd parameters specifying formatting options are not implemented in Invoke-Sqlcmd. The following table shows the relationship between the Invoke-Sqlcmd parameters and sqlcmd options:
Description |
sqlcmd option |
Invoke-Sqlcmd parameter |
---|---|---|
Server and instance name. |
-S |
-ServerInstance |
The initial database to use. |
-d |
-Database |
Run the specified query and exit. |
-Q |
-Query |
SQL Server Authentication login ID. |
-U |
-Username |
SQL Server Authentication password. |
-P |
-Password |
Variable definition. |
-v |
-Variable |
Query timeout interval. |
-t |
-QueryTimeout |
Stop running on an error |
-b |
-AbortOnError |
Dedicated Administrator Connection. |
-A |
-DedicatedAdministratorConnection |
Disable interactive commands, startup script, and environment variables. |
-X |
-DisableCommands |
Disable variable substitution. |
-x |
-DisableVariables |
Minimum severity level to report. |
-V |
-SeverityLevel |
Minimum error level to report. |
-m |
-ErrorLevel |
Login timeout interval. |
-l |
-ConnectionTimeout |
Hostname. |
-H |
-HbostName |
Change password and exit. |
-Z |
-NewPassword |
Input file containing a query |
-i |
-InputFile |
Maximum length of character output. |
-w |
-MaxCharLength |
Maximum length of binary output. |
-w |
-MaxBinaryLength |
Connect using SSL encryption. |
No parameter |
-EncryptConnection |
Display errors |
No parameter |
-OutputSqlErrors |
Output messages to stderr. |
-r |
No parameter |
Use client's regional settings |
-R |
No parameter |
Run the specified query and remain running. |
-q |
No parameter |
Code page to use for output data. |
-f |
No parameter |
Change a password and remain running |
-z |
No parameter |
Packet size |
-a |
No parameter |
Column separator |
-s |
No parameter |
Control output headers |
-h |
No parameter |
Specify control characters |
-k |
No parameter |
Fixed length display width |
-Y |
No parameter |
Variable length display width |
-y |
No parameter |
Echo input |
-e |
No parameter |
Enable quoted identifiers |
-I |
No parameter |
Remove trailing spaces |
-W |
No parameter |
List instances |
-L |
No parameter |
Format output as Unicode |
-u |
No parameter |
Print statistics |
-p |
No parameter |
Command end |
-c |
No parameter |
Connect using Windows Authentication |
-E |
No parameter |