Как войти в T-SQL

Я использую ADO.NET для доступа к SQL Server 2005 и хотел бы иметь возможность вести журнал внутри хранимых процедур T-SQL, которые я вызываю. Это как-то возможно?

Я не могу увидеть вывод оператора print при использовании ADO.NET, и, поскольку я хочу использовать ведение журнала только для отладки, идеальным решением было бы отправлять сообщения в DebugView из SysInternals.


person Jonas Engman    schedule 12.09.2008    source источник
comment
Просто отладочная информация. Например, X - это Foo   -  person Jonas Engman    schedule 12.09.2008


Ответы (10)


Я думаю, что запись в таблицу журнала была бы моим предпочтением.

В качестве альтернативы, поскольку вы используете 2005, вы можете написать простую процедуру SQLCLR для переноса EventLog.

Или вы можете использовать xp_logevent, если хотите записать в журнал SQL

person Galwegian    schedule 12.09.2008

Я решил это, написав процедуру SQLCLR, как предложил Эрик Z Beard. Сборка должна быть подписана файлом ключа со строгим именем.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static int Debug(string s)
    {
        System.Diagnostics.Debug.WriteLine(s);
            return 0;
        }
    }
}

Создал ключ и логин:

USE [master]
CREATE ASYMMETRIC KEY DebugProcKey FROM EXECUTABLE FILE =
'C:\..\SqlServerProject1\bin\Debug\SqlServerProject1.dll'

CREATE LOGIN DebugProcLogin FROM ASYMMETRIC KEY DebugProcKey 

GRANT UNSAFE ASSEMBLY TO DebugProcLogin  

Импортировал его в SQL Server:

USE [mydb]
CREATE ASSEMBLY SqlServerProject1 FROM
'C:\..\SqlServerProject1\bin\Debug\SqlServerProject1.dll' 
WITH PERMISSION_SET = unsafe

CREATE FUNCTION dbo.Debug( @message as nvarchar(200) )
RETURNS int
AS EXTERNAL NAME SqlServerProject1.[StoredProcedures].Debug

Затем я смог войти в процедуры T-SQL, используя

exec Debug @message = 'Hello World'
person Jonas Engman    schedule 13.02.2009

Вы можете либо войти в таблицу, просто вставив новую строку, либо реализовать хранимую процедуру CLR для записи в файл.

Будьте осторожны с записью в таблицу, потому что, если действие происходит в транзакции и транзакция откатывается, ваша запись в журнале исчезнет.

person Eric Z Beard    schedule 12.09.2008
comment
Что мы сделали, чтобы избежать проблемы исчезновения ведения журнала, так это записали записи журнала в табличную переменную, а затем вставили данные табличной переменной в таблицу журнала после фиксации или отката транзакции. - person HLGEM; 19.11.2009

Ведение журнала из SQL sproc лучше выполнять в самой базе данных. T-SQL может записывать в файлы, но на самом деле он для этого не предназначен.

person Unsliced    schedule 12.09.2008

Есть команда PRINT, но я предпочитаю войти в таблицу, чтобы вы могли запросить ее.

person Eugene Yokota    schedule 12.09.2008

Вы можете записывать строки в таблицу журнала из хранимой процедуры. Как указывали другие, вы можете изо всех сил писать в какой-либо текстовый файл или другой журнал с помощью CLR или xp_logevent, но похоже, что вам нужно больше объема, чем это было бы практично для таких целей.

Возникают сложные случаи (и именно для них вам действительно нужен ваш журнал), когда транзакции терпят неудачу. Поскольку любое ведение журнала, происходящее во время этих транзакций, будет отменено вместе с транзакцией, частью которой они являются, лучше всего иметь API ведения журнала, который ваши клиенты могут использовать для регистрации ошибок. Это может быть простой DAL, который либо ведет журнал в той же базе данных, либо в общей базе данных.

person Pittsburgh DBA    schedule 05.10.2008

Что бы это ни стоило, я обнаружил, что, когда я не назначаю обработчик InfoMessage моему SqlConnection:

sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(MySqlConnectionInfoMessageHandler);

где подпись InfoMessageHandler выглядит следующим образом:

MySqlConnectionInfoMessageHandler(object sender, SqlInfoMessageEventArgs e)

тогда мои операторы PRINT в моих Stored Procs не отображаются в DbgView.

person Steve D    schedule 19.11.2009
comment
Это лучший ответ из всех. - person Contango; 06.02.2017

Вы можете использовать выходные переменные для передачи обратных сообщений, но это зависит от выполнения процедуры без ошибок.

create procedure usp_LoggableProc 

@log varchar(max) OUTPUT 

as

-- T-SQL statement here ...

select @log = @log + 'X is foo'

И затем в вашем коде ADO было:

string log = (string)SqlCommand.Parameters["@log"].Value;

Вы можете использовать raiserror для создания собственных пользовательских ошибок с необходимой вам информацией, которая будет доступна вам через обычную коллекцию ошибок SqlException в вашем коде ADO:

RAISERROR('X is Foo', 10, 1)

Хм, но да, не могу не чувствовать себя только для отладки, и в вашей ситуации просто вставьте сообщения varchar в таблицу ошибок, как предлагали другие, и выберите * из нее, когда вы отлаживаете.

person hollystyles    schedule 12.09.2008

Вы можете проверить Log4TSQL. Он обеспечивает ведение журнала базы данных для хранимых процедур и триггеров в SQL Server 2005–2008. У вас есть возможность установить отдельные независимые уровни журнала для каждой процедуры/триггера.

person Daniel Pavic    schedule 15.12.2009
comment
Что такое архитектура, которая используется позади? Как LOG4SQL сохраняет данные журнала при откате? - person Roman Pokrovskij; 09.01.2014