2

I have this simple Powershell script that outputs the message "Hello World!" from SQL PRINT command:

$conn = New-Object System.Data.SqlClient.SqlConnection "Server=<server>;Database=msdb;Integrated Security=SSPI;";
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) Write-Host $event.Message};
$conn.add_InfoMessage($handler);
$conn.FireInfoMessageEventOnUserErrors = $true;
$conn.Open();
$cmd = $conn.CreateCommand();
$cmd.CommandTimeout=0
$cmd.CommandText = "PRINT 'Hello World!'";
$res = $cmd.ExecuteNonQuery();
$conn.Close();

I need to catch and parse this print output. How can I put it into a variable (in addition to just printing it out)?

2 Answers 2

5

You should assign the value of $event.Message to the global variable $global:msg (or other name starting with $global:). Then this variable will be reachable outside of the event handler scope:

$conn = New-Object System.Data.SqlClient.SqlConnection "Server=<server name>;Database=msdb;Integrated Security=SSPI;";
$global:msg = ""
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {
    param($sender, $event) 
    $global:msg = $event.Message
    Write-Host $global:msg
};
$conn.add_InfoMessage($handler);
$conn.FireInfoMessageEventOnUserErrors = $true
$conn.Open();
$cmd = $conn.CreateCommand();
$cmd.CommandTimeout=0
$cmd.CommandText = "PRINT 'Hello World!'";
$res = $cmd.ExecuteNonQuery();
$conn.Close();
Write-Host "The event handler message '$global:msg' is inside of the global variable!"
Sign up to request clarification or add additional context in comments.

Comments

-1

I suggest reversing order: putting in a variable first, then printing it out:

$message = 'Hello World!'

$conn = New-Object System.Data.SqlClient.SqlConnection "Server=<server>;Database=msdb;Integrated Security=SSPI;";
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) Write-Host $event.Message};
$conn.add_InfoMessage($handler);
$conn.FireInfoMessageEventOnUserErrors = $true;
$conn.Open();
$cmd = $conn.CreateCommand();
$cmd.CommandTimeout=0
$cmd.CommandText = "PRINT $message";
$res = $cmd.ExecuteNonQuery();
$conn.Close();

1 Comment

This will not work as I don't know what text of the output will be.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.