Как войти в систему T-SQL

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

Кто-то может найти это полезным:

idnamer<-function(x,y){#Alphabetical designation and number of integers required
    id<-c(1:y)
    for (i in 1:length(id)){
         if(nchar(id[i])<2){
            id[i]<-paste("0",id[i],sep="")
         }
    }
    id<-paste(x,id,sep="")
    return(id)
}
idnamer("EF",28)

Извините за форматирование.

12
задан Adi Inbar 26 November 2014 в 03:25
поделиться

10 ответов

Я решил это путем записи SQLCLR-процедуры как Eric Z предложенная Борода. Блок должен быть подписан с файлом ключей строгого имени.

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'
8
ответ дан 2 December 2019 в 05:29
поделиться

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

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

5
ответ дан 2 December 2019 в 05:29
поделиться

Я думаю, пишущий в таблицу журнала, было бы мое предпочтение.

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

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

7
ответ дан 2 December 2019 в 05:29
поделиться

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

5
ответ дан 2 December 2019 в 05:29
поделиться

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

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

1
ответ дан 2 December 2019 в 05:29
поделиться

Существует Команда печати, но я предпочитаю входить в таблицу, таким образом, можно запросить ее.

2
ответ дан 2 December 2019 в 05:29
поделиться

- Следующий DDL sql создаст Вас, таблица для хранения [дб] ИСПОЛЬЗОВАНИЯ данных логов ИДЕТ

/****** Object:  Table [dbo].[tbData_Debug]    Script Date: 02/12/2009 22:30:03 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[tbData_Debug](
    [colTimeStamp] [timestamp] NULL,
    [colNiceTime] [varchar](200) NULL,
    [colDomain_User] [varchar](200) NULL,
    [colMsg] [varchar](4000) NULL,
    [colDebugLevel] [int] NULL,
    [colDebugMsg] [varchar](4000) NULL,
    [colPageName] [varchar](200) NULL,
    [colClassName] [varchar](200) NULL,
    [colMethodName] [varchar](200) NULL,
    [colMethodNameGui] [varchar](4000) NULL,
    [colRet] [int] NULL,
    [colLineNumber] [int] NULL,
    [colLineNumberGui] [int] NULL,
    [colProcedureName] [varchar](200) NULL,
    [colProcedureStep] [varchar](4000) NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO




-- This stored procedure does write to the log table

USE [db]
GO
/****** Object:  StoredProcedure [dbo].[procUtils_AppDebug]    Script Date: 02/12/2009 22:29:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[procUtils_AppDebug] (                  

@ret int = null OUT,     
@msgIn varchar(4000) = null ,   -- the msg which the user has seen   
@msgOut varchar(4000) = null OUT ,   -- the msg which the user has seen   
@domain_user varchar(200) = null ,                 -- the domain user echoing the message  
@debugMsgIn varchar(4000) = null  ,   -- the debug msg for internal use  
@debugMsgOut varchar(4000) = null  OUT,   -- the debug msg for internal use  
@pageName varchar(200) = null ,   -- the pageName originator of error  
@className varchar(200) = null ,   -- the class Name orinator of error  
@methodName varchar(200) = null ,   -- the methodName where the last error occured  
@methodNameGui varchar(4000) = null ,   -- the methodNameOfTheGui where the last error occured  
@lineNumber int = null ,  -- the line number of the line issueing the error  
@lineNumberGui int = null,   -- the line number of the line issueing the error               
@procedureName varchar(200) = null , -- the procedureName currently envoked
@procedureStep varchar(4000)  = null -- the steps of the procedure concatenated
)    

AS                  
BEGIN -- proc start                
 SET NOCOUNT ON;                

BEGIN TRY        --begin try      

declare @debugLevel int     
select @debugLevel =  Debug_Level from User_tb where Domain_Name = @domain_user  

/*                  
select * from tbData_Debug    order by 1 desc              
delete from tbData_Debug              
*/    


insert into tbData_Debug ( colNiceTime , colDomain_User , colMsg , colDebugLevel ,   
colDebugMsg , colPageName , colClassName , colMethodName , colMethodNameGui ,   
colRet , colLineNumber , colLineNumberGui , colProcedureName , colProcedureStep) values (
 dbo.funcGetNiceTime() , @domain_user  , @msgIn , @debugLevel ,@debugMsgIn , 
 @pageName , @className , @methodName  ,@MethodNameGui , @ret , 
 @lineNumber , @lineNumberGui , @procedureName , @procedureStep)     

set @debugMsgOut = @debugMsgIn  
set @msgOut = 'Action Registered'  
set @ret = @@ERROR     
return @ret                



END TRY        --end try      

BEGIN CATCH            
 PRINT 'In CATCH block.             
 Error number: ' + CAST(ERROR_NUMBER() AS varchar(10)) + '            
 Error message: ' + ERROR_MESSAGE() + '            
 Error severity: ' + CAST(ERROR_SEVERITY() AS varchar(10)) + '            
 Error state: ' + CAST(ERROR_STATE() AS varchar(10)) + '            
 XACT_STATE: ' + CAST(XACT_STATE() AS varchar(10));            

 set  @debugMsgOut = 'error at [procUtils_AppDebug]--- Error number: ' + CAST(ERROR_NUMBER() AS varchar(10)) + 'Error message: ' + ERROR_MESSAGE() + 'Error severity: ' +   
CAST(ERROR_SEVERITY() AS varchar(10)) + 'Error state: ' + CAST(ERROR_STATE() AS varchar(10)) + 'XACT_STATE: ' + CAST(XACT_STATE() AS varchar(10))            
set @msgIn= 'error while saving application error info into database'  
insert into tbData_Debug ( colMsg ) values ( @msgIn )     

set @debugMsgOut = @debugMsgIn +  @debugMsgOut  
set @msgOut = 'Action Registration failed'  
set @ret = 1           

END CATCH            


return  @ret                       
END --procedure end                 

/*       
<procedureDocumentation>      

<procedurename>procUtils_AppDebug<procedurename>      
<procedureDescription> Records events from the Application Layer </procedureDescription>    
<created>20090121</created>      
<createdby>Yordan Georgiev</createdby>      
<change>      

<changewhen><changewhen>      
<changeDescription></changeDescription>      
<changedBy></changedBy>      
</change>      


<testUsage>    

USE [db]    
GO    

DECLARE @return_value int,    
  @ret int,    
  @msgIn varchar(max),    
  @debugmsg varchar(4000)    

SELECT @ret = 1    
SELECT @msgIn = N'msg'    
SELECT @debugmsg = N'before'    

EXEC @return_value = [dbo].[procUtils_AppDebug]    
  @ret = @ret OUTPUT,    
  @msgIn = @msgIn OUTPUT,    
  @domain_user = N'domain_user',    
  @debugmsg = @debugmsg OUTPUT,    

  @methodName = N'methodName'    

SELECT @ret as N'@ret',    
  @msgIn as N'@msgIn',    
  @debugmsg as N'@debugmsg'    

SELECT 'Return Value' = @return_value    
select * from tbData_Debug order by 1 desc    
GO    

</testUsage>      
</procedureDocumentation>      
*/  
-1
ответ дан 2 December 2019 в 05:29
поделиться

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

create procedure usp_LoggableProc 

@log varchar(max) OUTPUT 

as

-- T-SQL statement here ...

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

И затем в Вашем ADO кодируют somehwere:

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

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

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

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

0
ответ дан 2 December 2019 в 05:29
поделиться

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

sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(MySqlConnectionInfoMessageHandler);

, где подпись InfoMessageHandler выглядит так:

MySqlConnectionInfoMessageHandler(object sender, SqlInfoMessageEventArgs e)

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

1
ответ дан 2 December 2019 в 05:29
поделиться

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

0
ответ дан 2 December 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: