public DataTable[] ReadSqlCodeGuardResult(
			TemplateNodeSqlGuardQueryInfo guardQueryInfo,
			DataTable                     queryTable,
			List<ParameterValue>          userParams
		)
		{
			var analyzer     = new CodeGuardAnalyzer();
			var summaryTable = new DataTable();

			summaryTable.Columns.Add("SCGObject");
			summaryTable.Columns.Add("SCGErrorRows");

			foreach (var parameterValue in guardQueryInfo.ParameterValues)
			{
				summaryTable.Columns.Add(parameterValue.Name);
			}

			foreach (var parameterValue in userParams)
			{
				summaryTable.Columns.Add(parameterValue.Name);
			}

			var table = new DataTable();

			// 25/08/2014 Aleksey A. Saychenko - object code is not required
			// table.Columns.Add("SCGObject");

			table.Columns.Add("SCGErrorCode");
			table.Columns.Add("SCGRow");
			table.Columns.Add("SCGColumn");
			table.Columns.Add("SCGMessage");

			foreach (var parameterValue in guardQueryInfo.ParameterValues)
			{
				table.Columns.Add(parameterValue.Name);
			}

			foreach (var parameterValue in userParams)
			{
				table.Columns.Add(parameterValue.Name);
			}

			foreach (DataRow row in queryTable.Rows)
			{
				var sqlcode = row[guardQueryInfo.GetQueryCodeColumn()].ToString();
				var result  = analyzer.ProcessSqlQuery(
					sqlcode,
					guardQueryInfo.GetIncludedIssue(),
					guardQueryInfo.GetExcludedIssue()
				);
				var errorRows = new StringBuilder();
				var statements = result.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);

				foreach (var statement in statements)
				{
					var newRow = table.NewRow();

					// 25/08/2014 Aleksey A. Saychenko
					// newRow["SCGObject"] = row[guardQueryInfo.GetQueryCodeColumn()];

					var start = statement.IndexOf("(", StringComparison.Ordinal);
					var end = start < 0 ? 0 : statement.IndexOf(")", start, StringComparison.Ordinal);

					if (start > -1 && end > 0)
					{
						newRow["SCGErrorCode"] = statement.Substring(start + 1, end - 1);
					}

					newRow["SCGMessage"] = statement.Substring(end + 1);
					var position = Regex.Match(statement, "([0-9])+:([0-9])+").Value.Split(':');
					newRow["SCGRow"] = position[1];
					newRow["SCGColumn"] = position[0];
					errorRows.AppendFormat(",{0}", position[1]);

					foreach (var parameterValue in guardQueryInfo.ParameterValues)
					{
						newRow[parameterValue.Name] = row[parameterValue.StringValue ?? parameterValue.UserValue];
					}

					foreach (var parameterValue in userParams)
					{
						newRow[parameterValue.Name] = row[parameterValue.StringValue ?? parameterValue.UserValue];
					}

					table.Rows.Add(newRow);
				}

				if (!guardQueryInfo.GetAddSummary())
				{
					continue;
				}

				var newSummaryRow = summaryTable.NewRow();

				newSummaryRow["SCGObject"]    = row[guardQueryInfo.GetObjectColumn()];
				newSummaryRow["SCGErrorRows"] = errorRows.Length > 0 ? errorRows.Remove(0, 1).ToString() : String.Empty;

				summaryTable.Rows.Add(newSummaryRow);
			}

			if (!guardQueryInfo.GetAddSummary())
			{
				return new[] { table };
			}

			return new[] { table, summaryTable };
		}
		private void ProcessCodeGuardQuery(
			MultyQueryResultInfo          result,
			TemplateNodeSqlGuardQueryInfo guardQueryInfo)
		{
			var queryResultInfo = result.List.First(item => item.TemplateNodeQuery.Id == guardQueryInfo.SqlQueryId);
			var templateNodeQueryInfo = queryResultInfo.TemplateNodeQuery;
			var userParams = new List<ParameterValue>();

			if (base.Settings != null)
			{
				var querySettings = base.Settings.Connection.Activity.Parameters
					.Where(i => i.Key == guardQueryInfo.IdsHierarchy && i.Value != null);

				foreach (var info in querySettings)
				{
					switch (info.Type)
					{
						case ParameterInfoType.Attribute:
							guardQueryInfo.GetType().GetProperty("User" + info.Parameter)
								.SetValue(guardQueryInfo, info.Value, null);
							break;

						case ParameterInfoType.Parameter:
							var parameter =
								templateNodeQueryInfo.ParameterValues.FirstOrDefault(p => p.Name == info.Parameter);
							if (parameter != null)
							{
								parameter.UserValue = info.Value;
							}
							break;

						case ParameterInfoType.EditableParameter:
							var editparameter = new ParameterValue
							{
								Name = info.Parameter,
								StringValue = info.Default,
								UserValue = info.Value
							};
							userParams.Add(editparameter);
							break;
					}
				}
			}

			var guardQueryResult = new QueryResultInfo();

			foreach (var instanceResult in queryResultInfo.QueryResult.InstancesResult)
			{
				var instance = instanceResult.Key;
				var queryTable = instanceResult.Value.DatabasesResult.First().Value.DataTables.First();

				if (!queryTable.Columns.Contains(guardQueryInfo.QueryCodeColumn))
				{
					continue;
				}

				//var meta = ReadMeta(connectionGroup, templateNode, instance, database, templateNodeQueryInfo).FirstOrDefault();
				var meta = Storage.ReadLastMeta(
					base.TemplateNode,
					instance,
					templateNodeQueryInfo
				);

				if (meta == null)
				{
					continue;
				}

				QueryInstanceResultInfo guardInstanceResult;
				var timestamp = (DateTime)meta.Values[TableDefinition.DateCreated];

				result.RefreshTimestamp(timestamp);

				if (!string.IsNullOrEmpty(meta.Values[MetaResultTable.ErrorMessageFieldName].ToString()))
				{
					guardInstanceResult = new QueryInstanceResultInfo(
						new ErrorInfo(
							meta.Values[MetaResultTable.ErrorIdFieldName].ToString(),
							meta.Values[MetaResultTable.ErrorCodeFieldName].ToString(),
							meta.Values[MetaResultTable.ErrorMessageFieldName].ToString(),
							timestamp
						),
						instance
					);
				}
				else
				{
					guardInstanceResult = new QueryInstanceResultInfo(instance);
				}

				var dataTables = Storage.ReadSqlCodeGuardResult(guardQueryInfo, queryTable, userParams);

				QueryItemInfo queryItemInfo = new QueryItemInfo
				{
					ParentQuery = new QueryInfo { Name = guardQueryInfo.QueryName }
				};

				QueryDatabaseResultInfo databaseResult = new QueryDatabaseResultInfo(
					dataTables,
					queryItemInfo,
					base.GroupDefinition.Name,
					base.GroupDefinition.Id
				);

				guardInstanceResult.AddDatabaseResult(databaseResult);
				guardQueryResult.AddInstanceResult(guardInstanceResult);
			}

			var templateNodeResultItem = new TemplateNodeResultItem(guardQueryInfo, guardQueryResult);

			result.Add(templateNodeResultItem);
		}