2012-08-23 106 views
0

我需要编写一个简单的SQL日志程序,可以被称为是这样的:写SQL日志程序

Log("This is my param1 = {0}, param2 = {1} and param3('{2}')", 
    @param1, @param2, @param3) 

输出应该被重定向到SQL Server上的“文件C:\ output.txt中“

是否有可能使用这样一个程序与变量 params的数量和如何?

也许我可以用

exec master..xp_cmdshell 'echo created > c:\output.txt' 
exec master..xp_cmdshell 'echo appended data >> c:\output.txt' 
exec master..xp_cmdshell 'echo more data >> c:\output.txt' 
+0

...嗯,如何** ** **知道使用多个参数?这几乎看起来像是在SQL之外调用的东西(尤其是因为您通常不能访问系统维护的实际文件)。你打算如何打电话? –

+0

我需要一个'通用'SQL服务器端函数来记录调试存储过程的信息。我需要在文件中“调试”一些信息。我知道还有很多其他的选项可以调试,但我喜欢用txt文件编写。 – serhio

+0

出于安全性和其他原因,SQL Server通常不支持将输出发送到文件,尽管有一些缓慢而笨拙的方式来强制它(如'xp_CmdShell')。一般来说,如果你想记录SQL Server的东西,你最好将它记录到1)表,2)SQL Server错误日志,或者3)系统事件日志。所有这些都得到支持并且相对容易。 – RBarryYoung

回答

1

首先,SQL Server的T-SQL不允许可变数量的参数来存储过程像Java如何支持。但是,由于SQL Server 2005具有XML数据类型,因此可以使用参数构建一个简单的XML并将其作为第二个参数发送,首先是带有占位符的日志语句。在您的存储过程中,您可以从XML中读取这些值。

其次,xp_cmdshell要求您具有'sa'权限,afaik。相反,您可以将这些日志语句写入临时表并获取由管理员创建的存储过程,该过程使用表名和文件路径,并将表的内容转储到指定的文件路径。

编辑大约为每一个评论如下

+0

我需要使用此日志来调试存储过程,这可以通过事务调用。当我回滚事务时,日志表中的任何行将被回滚...在文本文件中,我拥有所有跟踪... – serhio

+0

SQL Server允许嵌套事务。因此,您可以在日志记录过程中启动自己的事务,并在完成后进行提交。然后封闭事务的结果不会影响您对日志过程的调用。 – Vikdor

+0

存储过程可以以可选参数的形式允许可变数量的参数。它不能做的是允许像参数数组那样的无限数量的参数。 – RBarryYoung

1

可变的参数个数注释只要你有参数的数量有限,您可以使用空的参数的SQL Server中实现可选参数

所以

create proc prcLog 
    @Format varchar(1000), 
    @p1 varchar(100) = null, 
    @p2 varchar(100) = null, 
    @p3 varchar(100) = null, 
    .... 

exec prcLog '{0}', 'a' 
exec prcLog '{0} : {1}', 'a', 'b' 

给定的文件IO和字符串操作量,CLR存储过程可能是一个更好的选择