Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写一个SQL日志过程_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

编写一个SQL日志过程

编写一个SQL日志过程,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我需要编写一个简单的SQL日志过程,可以这样调用: Log("This is my param1 = {0}, param2 = {1} and param3('{2}')", @param1, @param2, @param3) 输出应重定向到SQL Server“C:\output.txt”上的文件 是否可以对变量数量的参数使用此类程序,以及如何使用 也许我可以用 exec master..xp_cmdshell 'echo created > c:\output.txt

我需要编写一个简单的SQL日志过程,可以这样调用:

Log("This is my param1 = {0}, param2 = {1} and param3('{2}')", 
     @param1, @param2, @param3)
输出应重定向到SQL Server“C:\output.txt”上的文件

是否可以对变量数量的参数使用此类程序,以及如何使用

也许我可以用

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'

首先,SQLServer的T-SQL不允许像Java所支持的那样为存储过程提供可变数量的参数。但是,由于SQLServer2005具有XML数据类型,因此可以使用参数构建简单的XML,并将其作为第二个参数发送,第一个参数是带有占位符的log语句。在存储过程中,可以从XML读回这些值

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


根据下面的注释之一编辑关于可变参数数的注释

只要参数数有限,就可以在SQL server中使用可为空的参数来实现可选参数

所以


考虑到文件IO和字符串操作的数量,CLR存储过程可能是更好的选择

…嗯,SQL如何知道使用多个参数?这看起来就像是在SQL之外调用的东西(特别是因为您通常无法“访问”系统维护的实际文件)。您打算如何调用此函数?我需要一个“通用”SQL server端函数来记录调试存储过程所需的信息。我需要“调试”文件中的一些信息。我知道还有很多其他选项需要调试,但我喜欢在txt文件中编写。出于安全和其他原因,SQL Server通常不支持向文件发送输出,尽管有一些缓慢而笨拙的方法可以强制执行(如
xp\u CmdShell
)。通常,如果要从SQL Server记录内容,最好将其记录到1)表、2)SQL Server错误日志或3)系统事件日志中。所有这些都是受支持的,并且相对容易。我需要在调试存储过程时使用此日志,这可以通过事务调用。当我回滚事务时,日志表中的任何行都将回滚。。。在文本文件中,我有所有的跟踪…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'