Sql Server Print statements are useful for server management and are a way to send custom messages back to the client. Are you looking to optimize your SQL Server management? Rental-server.net offers a range of hosting solutions tailored to your needs. By understanding and effectively utilizing SQL Server print statements, alongside the right server infrastructure, you can significantly improve your database operations. Let’s explore how. Discover the power of efficient database management and enhance your server performance with our expert insights and hosting solutions.
1. What Is SQL Server Print and Why Is It Important?
SQL Server’s PRINT
statement is a Transact-SQL (T-SQL) command used to display user-defined messages to the client. It’s like a simple messenger, relaying information directly from the server to you. This is crucial for debugging, providing feedback on script execution, and monitoring database processes. Think of it as a “console.log” for your SQL Server. By using PRINT
, you can get real-time updates on what’s happening inside your database, making it easier to troubleshoot issues and understand the flow of your code.
1.1 The Fundamentals of the PRINT Statement
The PRINT
statement in SQL Server allows you to send messages back to the client. These messages can be static text, the value of variables, or the result of expressions. It’s a basic yet powerful tool for monitoring and debugging your SQL scripts.
1.2 Syntax of the PRINT Statement
The syntax is straightforward:
PRINT msg_str | @local_variable | string_expr
Here:
msg_str
: A character string or Unicode string constant.@local_variable
: A variable of any valid character data type.string_expr
: An expression that returns a string.
1.3 Use Cases for SQL Server Print Statements
SQL Server PRINT
statements are helpful in different situations. Below are a few:
- Debugging: Displaying variable values at different points in your script to track down errors.
- Monitoring: Providing real-time feedback on the progress of long-running processes.
- Conditional Logic: Displaying messages based on certain conditions being met or not.
1.4 Limitations of the PRINT Statement
While useful, PRINT
has limitations:
- Message Length: Non-Unicode strings are limited to 8,000 characters, and Unicode strings to 4,000 characters.
- No Formatting: It doesn’t support advanced formatting options like
RAISERROR
. - Client Dependency: The output is client-dependent; it might not be visible in all environments.
2. How to Implement SQL Server Print Statements Effectively
To effectively implement SQL Server PRINT
statements, let’s start with a basic example:
PRINT 'Hello, SQL Server!';
This will simply display “Hello, SQL Server!” in the messages tab of your SQL Server Management Studio (SSMS).
2.1 Printing Variables
You can print the values of variables to monitor their state during script execution:
DECLARE @myVariable INT = 100;
PRINT 'The value of myVariable is: ' + CAST(@myVariable AS VARCHAR);
Here, CAST
is used to convert the integer variable to a string so it can be concatenated with the message.
2.2 Using PRINT in Conditional Statements
PRINT
can be used within IF
statements to provide feedback based on certain conditions:
DECLARE @count INT = (SELECT COUNT(*) FROM myTable);
IF @count > 1000
PRINT 'The table contains more than 1000 rows.';
ELSE
PRINT 'The table contains 1000 rows or less.';
2.3 Printing Results of Expressions
You can also print the results of expressions:
PRINT 'The current date and time is: ' + CONVERT(VARCHAR, GETDATE(), 120);
Here, CONVERT
is used to format the date and time into a readable string.
2.4 Best Practices for Using PRINT
- Use descriptive messages: Make your messages clear and informative.
- Limit message length: Keep messages concise to avoid truncation.
- Use sparingly in production: Avoid excessive use in production environments to minimize overhead.
2.5 Alternatives to PRINT
While PRINT
is useful, there are alternatives:
- RAISERROR: Offers more control over error messages, including severity levels and custom error numbers.
- SQL Server Profiler/Extended Events: Powerful tools for monitoring server activity, including capturing
PRINT
statements.
3. How SQL Server Print Statements Aid in Debugging
SQL Server PRINT
statements can be very useful when debugging your code. Debugging is all about finding and fixing problems in your code, and PRINT
statements can help you understand what your code is doing at different points. This way, you can identify issues and ensure your code runs smoothly.
3.1 Identifying Issues
By strategically placing PRINT
statements in your code, you can track the values of variables and the flow of execution. This helps you quickly identify where problems are occurring.
3.2 Example Debugging Scenario
Let’s consider a scenario where you’re updating a table based on some conditions:
DECLARE @CustomerID INT = 123;
DECLARE @NewStatus VARCHAR(50) = 'Active';
PRINT 'Before update - CustomerID: ' + CAST(@CustomerID AS VARCHAR) + ', NewStatus: ' + @NewStatus;
UPDATE Customers
SET Status = @NewStatus
WHERE CustomerID = @CustomerID;
PRINT 'After update - CustomerID: ' + CAST(@CustomerID AS VARCHAR) + ', NewStatus: ' + @NewStatus;
By printing the values of @CustomerID
and @NewStatus
before and after the update, you can verify that the update is happening correctly.
3.3 Debugging Loops
PRINT
statements are particularly useful in loops:
DECLARE @i INT = 0;
WHILE @i < 10
BEGIN
PRINT 'Iteration: ' + CAST(@i AS VARCHAR);
SET @i = @i + 1;
END
This will print the current iteration number, allowing you to track the loop’s progress.
3.4 Using PRINT with TRY…CATCH
In error handling, PRINT
can help you understand what went wrong:
BEGIN TRY
-- Code that might cause an error
DECLARE @result INT = 10 / 0;
PRINT 'Result: ' + CAST(@result AS VARCHAR); -- This line will not be reached if an error occurs
END TRY
BEGIN CATCH
PRINT 'An error occurred: ' + ERROR_MESSAGE();
END CATCH
Here, if a division by zero error occurs, the CATCH
block will print the error message.
3.5 Tips for Effective Debugging
- Be strategic: Place
PRINT
statements at key points in your code. - Use clear messages: Make your messages descriptive and easy to understand.
- Remove or comment out: Once debugging is complete, remove or comment out the
PRINT
statements.
4. How to Monitor Database Processes with SQL Server Print
SQL Server PRINT
statements can be used to monitor database processes by providing real-time feedback on the progress of long-running tasks, helping you keep track of what’s happening inside your database. This is crucial for maintaining performance and identifying potential bottlenecks.
4.1 Monitoring Long-Running Processes
When running long scripts, it’s helpful to know the progress. PRINT
can provide updates at different stages:
PRINT 'Starting the data processing...';
-- Perform some data processing tasks
-- ...
PRINT 'Data extraction complete. Starting transformation...';
-- Perform data transformation tasks
-- ...
PRINT 'Data transformation complete. Starting load...';
-- Perform data loading tasks
-- ...
PRINT 'Data processing complete.';
These messages provide a high-level overview of the process.
4.2 Tracking Progress in Loops
For loops that process large amounts of data, PRINT
can show the current status:
DECLARE @i INT = 1;
DECLARE @totalRows INT = (SELECT COUNT(*) FROM LargeTable);
WHILE @i <= @totalRows
BEGIN
PRINT 'Processing row: ' + CAST(@i AS VARCHAR) + ' of ' + CAST(@totalRows AS VARCHAR);
-- Process the current row
-- ...
SET @i = @i + 1;
END
This will print the current row number being processed.
4.3 Monitoring Performance
You can also use PRINT
to monitor the time taken by different parts of your script:
DECLARE @startTime DATETIME = GETDATE();
PRINT 'Starting task at: ' + CONVERT(VARCHAR, @startTime, 120);
-- Perform some task
-- ...
DECLARE @endTime DATETIME = GETDATE();
DECLARE @duration INT = DATEDIFF(ms, @startTime, @endTime);
PRINT 'Task completed at: ' + CONVERT(VARCHAR, @endTime, 120);
PRINT 'Task duration: ' + CAST(@duration AS VARCHAR) + ' ms';
This will print the start time, end time, and duration of the task in milliseconds.
4.4 Real-Time Feedback
PRINT
statements can provide real-time feedback on the status of database operations, allowing you to quickly identify and address any issues.
4.5 Integrating with Server Infrastructure
Consider integrating your SQL Server with robust infrastructure solutions like those offered by rental-server.net to ensure optimal performance and reliability. This way you can make sure your database can handle the load.
5. How SQL Server Print Statements Handle Conditional Logic
SQL Server PRINT
statements work well with conditional logic. This is where you use IF
, ELSE IF
, and ELSE
statements to control what messages are displayed based on certain conditions. Conditional logic can help you monitor database processes, validate data, and handle errors.
5.1 Basic IF Statement
The simplest form of conditional logic is the IF
statement:
DECLARE @value INT = 10;
IF @value > 5
PRINT 'The value is greater than 5.';
This will print the message only if @value
is greater than 5.
5.2 IF…ELSE Statement
You can add an ELSE
clause to handle the case where the condition is not met:
DECLARE @value INT = 3;
IF @value > 5
PRINT 'The value is greater than 5.';
ELSE
PRINT 'The value is 5 or less.';
This will print the appropriate message based on the value of @value
.
5.3 IF…ELSE IF…ELSE Statement
For more complex conditions, you can use ELSE IF
:
DECLARE @value INT = 7;
IF @value > 10
PRINT 'The value is greater than 10.';
ELSE IF @value > 5
PRINT 'The value is greater than 5 but not greater than 10.';
ELSE
PRINT 'The value is 5 or less.';
This allows you to handle multiple conditions.
5.4 Using PRINT for Data Validation
Conditional logic can be used to validate data:
DECLARE @email VARCHAR(255) = '[email protected]';
IF @email LIKE '%@%.%'
PRINT 'The email address is valid.';
ELSE
PRINT 'The email address is invalid.';
This checks if the email address has a valid format.
5.5 Error Handling with Conditional Logic
You can use conditional logic to handle errors:
DECLARE @divisor INT = 0;
IF @divisor = 0
PRINT 'Error: Division by zero.';
ELSE
PRINT 'Result: ' + CAST(10 / @divisor AS VARCHAR);
This prevents a division by zero error.
5.6 Combining with TRY…CATCH
For more robust error handling, combine conditional logic with TRY...CATCH
:
BEGIN TRY
DECLARE @divisor INT = 0;
IF @divisor = 0
THROW 50000, 'Division by zero error.', 1;
DECLARE @result INT = 10 / @divisor;
PRINT 'Result: ' + CAST(@result AS VARCHAR);
END TRY
BEGIN CATCH
PRINT 'Error: ' + ERROR_MESSAGE();
END CATCH
This will catch the error and print a user-friendly message.
6. Why SQL Server Print Is Not Always the Best Choice
SQL Server PRINT
statements are useful for debugging and monitoring, but they’re not always the best choice, especially in production environments or for complex tasks. While it is simple and easy to use, the PRINT
statement has limitations. There are better tools that offer more functionality and control.
6.1 Performance Overhead
PRINT
statements can add overhead, especially in high-volume transactions. Each PRINT
statement requires the server to send a message back to the client, which can slow things down.
6.2 Limited Functionality
PRINT
has limited functionality compared to other tools. It doesn’t support formatting, severity levels, or custom error numbers like RAISERROR
.
6.3 Client Dependency
The output of PRINT
is client-dependent. This means the output might not be visible in all environments, and it’s not suitable for logging or auditing.
6.4 Alternatives to PRINT
- RAISERROR: Offers more control over error messages and supports custom error numbers and severity levels.
- SQL Server Profiler/Extended Events: These tools are great for monitoring server activity, including capturing
PRINT
statements, but they provide much more detailed information and have less overhead. - Logging to a Table: For production environments, logging messages to a table is a better approach. This allows you to store and analyze the messages later without impacting performance.
6.5 Example: Logging to a Table
Here’s an example of how to log messages to a table:
-- Create a log table
CREATE TABLE LogTable (
LogID INT IDENTITY(1,1) PRIMARY KEY,
LogTime DATETIME DEFAULT GETDATE(),
Message VARCHAR(MAX)
);
-- Create a stored procedure to log messages
CREATE PROCEDURE LogMessage (
@Message VARCHAR(MAX)
)
AS
BEGIN
INSERT INTO LogTable (Message) VALUES (@Message);
END;
-- Use the stored procedure to log a message
EXEC LogMessage 'Starting the data processing...';
This approach is more robust and scalable than using PRINT
statements.
6.6 When to Use PRINT
Despite its limitations, PRINT
can be useful for quick debugging and testing in development environments. However, for production environments and complex tasks, it’s best to use more powerful tools like RAISERROR
, SQL Server Profiler, or logging to a table.
7. RAISERROR vs SQL Server Print: Which Is Better?
When it comes to displaying messages in SQL Server, both RAISERROR
and PRINT
have their uses. However, RAISERROR
offers more functionality and control, making it a better choice for many scenarios.
7.1 Key Differences
- Functionality:
RAISERROR
supports formatting, severity levels, and custom error numbers, whilePRINT
is limited to simple text output. - Error Handling:
RAISERROR
is designed for error handling and can be used to raise custom errors.PRINT
is primarily for displaying informational messages. - Control:
RAISERROR
gives you more control over how messages are displayed and handled.
7.2 RAISERROR Syntax
The syntax for RAISERROR
is more complex than PRINT
:
RAISERROR (
{ msg_str | msg_id }
,severity
,state
[ ,argument [ ,...n ] ]
)
[ WITH option [ ,...n ] ]
Here:
msg_str
: The message text.msg_id
: The ID of a message stored in thesys.messages
catalog view.severity
: The severity level of the error (0-25).state
: An integer from 0 to 255.argument
: Arguments to be substituted into the message string.option
: Options such asLOG
,NOWAIT
, andSETERROR
.
7.3 Example: Using RAISERROR
Here’s an example of how to use RAISERROR
:
RAISERROR ('This is a custom error message.', 16, 1);
This will raise an error with severity level 16 and state 1.
7.4 Formatting with RAISERROR
You can use arguments to format the message:
DECLARE @value INT = 10;
RAISERROR ('The value is %d.', 16, 1, @value);
This will display “The value is 10.”
7.5 Severity Levels
Severity levels indicate the type of error:
- 0-10: Informational messages.
- 11-16: Errors that can be corrected by the user.
- 17-25: Severe errors that may require system administrator intervention.
7.6 When to Use RAISERROR
Use RAISERROR
when you need more control over error messages, custom error numbers, or severity levels. It’s particularly useful for error handling and raising custom errors.
7.7 When to Use PRINT
Use PRINT
for simple debugging and displaying informational messages in development environments. However, for production environments and complex tasks, RAISERROR
is generally a better choice.
8. Real-World Examples of SQL Server Print Usage
SQL Server PRINT
statements are used in a variety of real-world scenarios, from debugging to monitoring and data validation. They are simple and effective for providing feedback during script execution.
8.1 Debugging Stored Procedures
When developing stored procedures, PRINT
statements can help you track the values of variables and the flow of execution:
CREATE PROCEDURE MyProcedure
@param1 INT,
@param2 VARCHAR(50)
AS
BEGIN
PRINT 'Starting MyProcedure with @param1 = ' + CAST(@param1 AS VARCHAR) + ', @param2 = ' + @param2;
-- Perform some operations
-- ...
PRINT 'Operation 1 complete.';
-- Perform another operation
-- ...
PRINT 'Operation 2 complete.';
PRINT 'Ending MyProcedure.';
END;
These messages provide a clear picture of what’s happening inside the stored procedure.
8.2 Monitoring Data Imports
During data imports, PRINT
statements can show the progress:
DECLARE @totalRows INT = (SELECT COUNT(*) FROM StagingTable);
DECLARE @currentRow INT = 1;
WHILE @currentRow <= @totalRows
BEGIN
PRINT 'Importing row ' + CAST(@currentRow AS VARCHAR) + ' of ' + CAST(@totalRows AS VARCHAR);
-- Import the current row
-- ...
SET @currentRow = @currentRow + 1;
END;
PRINT 'Data import complete.';
This provides real-time feedback on the import process.
8.3 Validating Data
PRINT
statements can be used to validate data:
DECLARE @email VARCHAR(255) = '[email protected]';
IF @email LIKE '%@%.%'
PRINT 'Email address is valid.';
ELSE
PRINT 'Email address is invalid.';
This checks if the email address has a valid format.
8.4 Error Handling
In error handling, PRINT
can help you understand what went wrong:
BEGIN TRY
-- Code that might cause an error
DECLARE @result INT = 10 / 0;
PRINT 'Result: ' + CAST(@result AS VARCHAR); -- This line will not be reached if an error occurs
END TRY
BEGIN CATCH
PRINT 'An error occurred: ' + ERROR_MESSAGE();
END CATCH
Here, if a division by zero error occurs, the CATCH
block will print the error message.
8.5 Integrating with Server Management
Consider integrating your SQL Server with robust server management solutions like those offered by rental-server.net to ensure optimal performance and reliability.
8.6 Logging to a Table
Here’s an example of how to log messages to a table:
-- Create a log table
CREATE TABLE LogTable (
LogID INT IDENTITY(1,1) PRIMARY KEY,
LogTime DATETIME DEFAULT GETDATE(),
Message VARCHAR(MAX)
);
-- Create a stored procedure to log messages
CREATE PROCEDURE LogMessage (
@Message VARCHAR(MAX)
)
AS
BEGIN
INSERT INTO LogTable (Message) VALUES (@Message);
END;
-- Use the stored procedure to log a message
EXEC LogMessage 'Starting the data processing...';
This approach is more robust and scalable than using PRINT
statements.
9. What Are the Common Mistakes to Avoid with SQL Server Print?
When using SQL Server PRINT
statements, there are several common mistakes to avoid. These mistakes can lead to inaccurate information, performance issues, and difficulty in debugging.
9.1 Overuse in Production
One of the most common mistakes is overusing PRINT
statements in production environments. Each PRINT
statement requires the server to send a message back to the client, which can add overhead and slow things down.
9.2 Ignoring Message Length Limits
PRINT
statements have message length limits: 8,000 characters for non-Unicode strings and 4,000 characters for Unicode strings. Ignoring these limits can lead to truncated messages and incomplete information.
9.3 Using PRINT for Error Handling
PRINT
is not designed for error handling. It doesn’t support severity levels, custom error numbers, or the ability to halt execution. Using PRINT
for error handling can lead to missed errors and incorrect behavior.
9.4 Not Removing PRINT Statements
Forgetting to remove PRINT
statements after debugging is complete can lead to unnecessary overhead and clutter in the output. Always remove or comment out PRINT
statements when they are no longer needed.
9.5 Not Using Descriptive Messages
Using vague or unclear messages can make it difficult to understand the output and debug effectively. Make sure your messages are descriptive and provide enough context to be useful.
9.6 Relying on PRINT for Logging
PRINT
is not a reliable logging mechanism. The output is client-dependent and may not be visible in all environments. For logging, use a more robust approach such as logging to a table or using SQL Server Profiler.
9.7 Not Formatting Messages Properly
When printing variables or expressions, make sure to format the messages properly. This includes converting data types to strings and using appropriate formatting functions.
9.8 Example of Poor Formatting
DECLARE @date DATETIME = GETDATE();
PRINT 'The current date is: ' + @date; -- Incorrect
This will result in an error because you cannot directly concatenate a DATETIME
value with a string.
9.9 Correct Formatting
DECLARE @date DATETIME = GETDATE();
PRINT 'The current date is: ' + CONVERT(VARCHAR, @date, 120); -- Correct
This will correctly convert the DATETIME
value to a string before concatenating it.
9.10 Alternatives to PRINT
- RAISERROR: Offers more control over error messages and supports custom error numbers and severity levels.
- SQL Server Profiler/Extended Events: Powerful tools for monitoring server activity, including capturing
PRINT
statements, but they provide much more detailed information and have less overhead. - Logging to a Table: For production environments, logging messages to a table is a better approach. This allows you to store and analyze the messages later without impacting performance.
10. How to Optimize SQL Server Performance with Efficient Print Statements
SQL Server PRINT
statements can be valuable for debugging and monitoring, but they can also impact performance if not used carefully. Optimizing the use of PRINT
statements can help minimize overhead and ensure efficient SQL Server performance.
10.1 Minimize Use in Production
The most effective way to optimize performance is to minimize the use of PRINT
statements in production environments. Each PRINT
statement requires the server to send a message back to the client, which can add overhead and slow things down.
10.2 Use Conditional Logic
Use conditional logic to control when PRINT
statements are executed. This can help reduce the number of messages sent to the client and minimize overhead.
10.3 Limit Message Length
Keep messages concise to avoid truncation and minimize the amount of data sent to the client. Remember that non-Unicode strings are limited to 8,000 characters, and Unicode strings to 4,000 characters.
10.4 Use Alternatives for Logging
For logging purposes, use more efficient alternatives such as logging to a table or using SQL Server Profiler/Extended Events. These methods provide more robust and scalable logging capabilities with less overhead.
10.5 Example: Logging to a Table
Here’s an example of how to log messages to a table:
-- Create a log table
CREATE TABLE LogTable (
LogID INT IDENTITY(1,1) PRIMARY KEY,
LogTime DATETIME DEFAULT GETDATE(),
Message VARCHAR(MAX)
);
-- Create a stored procedure to log messages
CREATE PROCEDURE LogMessage (
@Message VARCHAR(MAX)
)
AS
BEGIN
INSERT INTO LogTable (Message) VALUES (@Message);
END;
-- Use the stored procedure to log a message
EXEC LogMessage 'Starting the data processing...';
This approach is more robust and scalable than using PRINT
statements.
10.6 Remove or Comment Out
Always remove or comment out PRINT
statements when they are no longer needed. This will prevent unnecessary overhead and clutter in the output.
10.7 Use SQL Server Profiler
SQL Server Profiler is a powerful tool for monitoring server activity and identifying performance bottlenecks. It can capture PRINT
statements and other events, allowing you to analyze their impact on performance.
10.8 Extended Events
Extended Events is a more modern and flexible alternative to SQL Server Profiler. It allows you to capture a wide range of events with minimal overhead.
10.9 Monitor Server Performance
Regularly monitor server performance using tools like SQL Server Management Studio (SSMS) and Performance Monitor. This will help you identify any performance issues caused by PRINT
statements or other factors.
FAQ about SQL Server Print
Here are some frequently asked questions about SQL Server PRINT
statements:
1. What is the purpose of the PRINT statement in SQL Server?
The PRINT
statement is used to display user-defined messages to the client. It is useful for debugging, monitoring, and providing feedback on script execution.
2. What is the syntax of the PRINT statement?
The syntax is: PRINT msg_str | @local_variable | string_expr
3. What are the limitations of the PRINT statement?
Limitations include message length limits (8,000 characters for non-Unicode strings, 4,000 characters for Unicode strings), limited functionality, and client dependency.
4. How can I print the value of a variable in SQL Server?
You can print the value of a variable by converting it to a string and concatenating it with the message: PRINT 'The value is: ' + CAST(@variable AS VARCHAR)
5. Can I use PRINT in conditional statements?
Yes, you can use PRINT
in IF
statements to provide feedback based on certain conditions:
IF @value > 5
PRINT 'The value is greater than 5.';
ELSE
PRINT 'The value is 5 or less.';
6. What is the difference between PRINT and RAISERROR?
RAISERROR
offers more control over error messages, supports custom error numbers and severity levels, and is designed for error handling. PRINT
is primarily for displaying informational messages.
7. How can I log messages to a table instead of using PRINT?
You can create a log table and a stored procedure to log messages:
-- Create a log table
CREATE TABLE LogTable (
LogID INT IDENTITY(1,1) PRIMARY KEY,
LogTime DATETIME DEFAULT GETDATE(),
Message VARCHAR(MAX)
);
-- Create a stored procedure to log messages
CREATE PROCEDURE LogMessage (
@Message VARCHAR(MAX)
)
AS
BEGIN
INSERT INTO LogTable (Message) VALUES (@Message);
END;
-- Use the stored procedure to log a message
EXEC LogMessage 'Starting the data processing...';
8. How can I optimize the performance of PRINT statements?
Minimize use in production, use conditional logic, limit message length, and use alternatives for logging.
9. What are the common mistakes to avoid with SQL Server PRINT?
Common mistakes include overuse in production, ignoring message length limits, using PRINT
for error handling, not removing PRINT
statements, and not using descriptive messages.
10. Can I use PRINT to monitor long-running processes?
Yes, you can use PRINT
statements to provide updates at different stages of long-running processes:
PRINT 'Starting the data processing...';
-- Perform some data processing tasks
-- ...
PRINT 'Data extraction complete. Starting transformation...';
-- Perform data transformation tasks
-- ...
PRINT 'Data transformation complete. Starting load...';
-- Perform data loading tasks
-- ...
PRINT 'Data processing complete.';
SQL Server PRINT
statements are a simple yet useful tool for debugging, monitoring, and providing feedback on script execution. While they have limitations and should be used carefully in production environments, they can be valuable for development and testing. By understanding the syntax, best practices, and common mistakes to avoid, you can use PRINT
statements effectively to improve your SQL Server development and management.
For robust server solutions that enhance your SQL Server performance, consider rental-server.net. Contact us at +1 (703) 435-2000 or visit our website at rental-server.net. Our address is 21710 Ashbrook Place, Suite 100, Ashburn, VA 20147, United States.