SQL Server: получение сообщений от ссылочной сущности процедуры в коде - PullRequest
0 голосов
/ 24 сентября 2018

Я запускаю большое сканирование зависимостей на устаревшей базе данных и вижу, что некоторые объекты имеют устаревшие ссылки ref, если вы запустите этот код в SSMS для View, который указывает на несуществующую таблицу, как в моем случае, вы получите свой вывод Results вкладка И информация об ошибке в Messages.Как и в моем случае ниже.

Я пытался проверить все вещи env, которые я знаю, и вывод этой хранимой процедуры, но не увидел никаких указаний.

Как я могу записать это событие, когда язапускаю это в циклическом динамическом сценарии SQL и записываю вывод в мою таблицу для дальнейшей обработки?

Обновлено:

  1. это просто текст в поле Messageпри ошибке у вас все еще есть вывод на
    Results tab
  2. это sp, он перебирает список объектов, который я взял из sys.object, и запускаю эту строку в качестве образца для получения всех зависимостей, загружаемвсе в таблицу.Этот вызов sql_reference_entities - единственный способ получить зависимость между базами данных
    от уровня столбца.Поэтому мне нужно придерживаться этого 100 $>

-

Select * 
From  sys.dm_sql_referenced_entities('dbo.v_View_Obs_Table','Object')

-

enter image description here

1 Ответ

0 голосов
/ 24 сентября 2018

TLDR заключается в том, что вы не можете перехватить их на стороне сервера и должны использовать клиентскую программу на C #, PowerShell или другом клиенте, который может обрабатывать информационные сообщения.

Что DMV делает что-то странноечто я не до конца понимаю.Он генерирует ошибки (что обычным UDF не разрешено делать), и эти ошибки не вызывают блок TRY / CATCH или установку @@ error.EG

create table tempdb.dbo.foo(id int)
go
create view dbo.v_View_Obs_Table
as

select * from tempdb.dbo.foo

go

drop table tempdb.dbo.foo
go
begin try
   Select * From  sys.dm_sql_referenced_entities('dbo.v_View_Obs_Table','Object')
end try
begin catch
  select ERROR_MESSAGE(); --<-- not hit
end catch  

Однако это реальные ошибки, как вы можете видеть, выполняя это из кода клиента:

using System;
using System.Data.SqlClient;

namespace ConsoleApp6
{


    class Program
    {
        static void Main(string[] args)
        {

            using (var con = new SqlConnection("Server=.;database=AdventureWorks;integrated security=true"))
            {
                con.Open();
                con.FireInfoMessageEventOnUserErrors = true;


                con.InfoMessage += (s, a) =>
                {
                    Console.WriteLine($"{a.Message}");
                    foreach (SqlError e in a.Errors)
                    {
                        Console.WriteLine($"{e.Message} Number:{e.Number} Class:{e.Class} State:{e.State} at {e.Procedure}:{e.LineNumber}");
                    }

                };

                var cmd = con.CreateCommand();

                cmd.CommandText = "Select * From  sys.dm_sql_referenced_entities('dbo.v_View_Obs_Table','Object')";

                using (var rdr = cmd.ExecuteReader())
                {

                    while (rdr.Read() || (rdr.NextResult() && rdr.Read()))
                    {
                        Console.WriteLine(rdr[0]);
                    }

                }

                Console.ReadKey();


            }
        }
    }
}

output

Invalid object name 'tempdb.dbo.foo'.
Invalid object name 'tempdb.dbo.foo'. Number:208 Class:16 State:3 at v_View_Obs_Table:4
0
The dependencies reported for entity "dbo.v_View_Obs_Table" might not include references to all columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity.  Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.
The dependencies reported for entity "dbo.v_View_Obs_Table" might not include references to all columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity.  Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist. Number:2020 Class:16 State:1 at :1
...