SQL命令字符串C#

问题描述

我目前正在编写一个小的脚本,该脚本可以导出程序的事件日志并将其写入数据库。但是,我的sql insert命令遇到问题。我究竟做错了什么?这只是一个代码切口

string command = "DECLARE @x xml;";
command += "SELECT @x = P";
command += "FROM OPENROWSET(BULK 'C:\\Users\\NT-AUTORITÄT\\SYstem\\MFilesLog\\Event-Log 23.10.2020 09-05.xml',SINGLE_BLOB) AS Products(P)";
command += "SELECT @x";
command += "DECLARE @hdoc int";
command += "EXEC sp_xml_preparedocument @hdoc,OUTPUT,@x";
command += "INSERT INTO [MFlogs].[dbo].[MLogs]";
command += "SELECT * FROM OPENXML(@hdoc,'/Export/root/event/data/objectversion/objver',2);";
command += "WITH(";
command += "id int '../../../id',";
command += "type varchar(50) '../../../type',";
command += "category varchar(50) '../../../category',";
command += "timestamp varchar(50) '../../../timestamp',";
command += "causedbyuser varchar(50) '../../../causedbyuser',";
command += "objtype varchar(50),";
command += "objid varchar(50),";
command += "version varchar(50),";
command += "objectguid varchar(50) '../objectguid',";
command += "versionguid varchar(50) '../versionguid',";
command += "title varchar(100) '../title',";
command += "displayid int '../displayid')";

sqlCommand cmd = new sqlCommand(command,connection);
int result = cmd.ExecuteNonQuery();

这是事件日志中的错误

必须声明@ hdoc标量变量。

有人可以帮忙吗?

解决方法

仅查看第一行,就会遇到问题:

    command += "SELECT @x = P";
    command += "FROM OPENROWSET(BULK 'C:\\Users\\NT-AUTORITÄT\\SYSTEM\\MFilesLog\\Event-Log 23.10.2020 09-05.xml',SINGLE_BLOB) AS Products(P)";

最终会像这样

SELECT @x = PFROM OPENROWSET(BULK 'C:\\Users\\NT-AUTORI ....

因为您没有这样的间隔,但在其他任何地方也都需要它:

command += "SELECT @x = P";
command += " FROM OPENROWSET(BULK 'C:\\Users\\NT-AUTORITÄT\\SYSTEM\\MFilesLog\\Event-Log 23.10.2020 09-05.xml',SINGLE_BLOB) AS Products(P)";

尝试解决所有间距问题,然后看看会发生什么。

,

OUTPUT之前不需要逗号。

替换

command += "EXEC sp_xml_preparedocument @hdoc,OUTPUT,@x";

使用

command += " EXEC sp_xml_preparedocument @hdoc OUTPUT,@x";

请参见https://docs.microsoft.com/ru-ru/sql/relational-databases/system-stored-procedures/sp-xml-preparedocument-transact-sql?view=sql-server-ver15

还要在每个字符串的开头添加一个空格,或者使用Environment.NewLine或使用StringBuilder.AppendLine