/// <summary>
        /// Gets the name of the SQL server from the exception.
        /// </summary>
        /// <param name="ex">The exception.</param>
        /// <returns>
        /// SQL server instance name
        /// </returns>
        private static string GetServerName(SqlException ex)
        {
            if (ex.Data.Contains(Server))
            {
                return(ex.GetContextDataItem <string>(Server));
            }

            return(string.IsNullOrEmpty(ex.Server) ? "Unknown" : ex.Server);
        }
        /// <summary>
        /// Formats detail of the <see cref="SqlException" /> to a string.
        /// </summary>
        /// <param name="ex">The exception.</param>
        /// <returns>
        /// Formatted exception text.
        /// </returns>
        public static string Format(this SqlException ex)
        {
            var server = GetServerName(ex);
            var sb     = new StringBuilder();

            sb.AppendLine("SqlException caught!")
            .AppendLine($"Client:              {Environment.MachineName}")
            .AppendLine($"Server:              {server}");

            var hasContextData = ex.Data.Contains(HasContextData);

            var batchBeginLineNumber = 0;

            if (hasContextData)
            {
                batchBeginLineNumber = ex.GetContextDataItem <int>(BatchBeginLineNumber);
                sb.AppendLine($"Batch:               {ex.GetContextDataItem<string>(BatchSource)}, beginning at line {batchBeginLineNumber}");
            }

            sb.AppendLine(FormatSqlError(ex.Errors[0], batchBeginLineNumber, false));

            if (ex.Errors.Count > 1)
            {
                sb.AppendLine("Errors:");

                for (var i = 1; i < ex.Errors.Count; ++i)
                {
                    sb.AppendLine($"Error #{i}").AppendLine(FormatSqlError(ex.Errors[i], batchBeginLineNumber, true));
                }
            }

            if (hasContextData)
            {
                sb.AppendLine("Error near:");
                sb.AppendLine(ex.GetContextDataItem <string>(ErrorStatement));
            }

            return(sb.ToString());
        }