从C#将参数传递给T-SQL SP?

时间:2018-04-17 11:52:15

标签: sql-server xml tsql stream

是否可以将XML文件作为参数从C#应用程序流式传输到MS SQL存储过程,而无需将其加载到c#end的内存中?

我拥有的XML文件相当大,约600MB,有2mil条目。你可以想象,这需要大量的内存。

一旦SP on SQL在这些文件中插入/更新数据库中的值,它就没有进一步的用途,可以处理它们。

SQL示例:

CREATE PROCEDURE [dbo].[AddAllFromList] 
(
    @XmlData XML
)
BEGIN
    Do something with @XmlData;
END;

C#示例

using (Stream XMLFileStream = new someFileInfo.OpenRead())
using (SqlConnection Connection = new SqlConnection(SQLConnectionString))
{
    var opensql = Connection.OpenAsync();
    SqlCommand sqlcommand = new SqlCommand("AddAllFromList", Connection)
    {
        CommandType = System.Data.CommandType.StoredProcedure,
        CommandTimeout = 360
    };
    sqlcommand.Parameters.Add("@XmlData", SqlDbType.Xml).Value = XMLFileStream;
try
{
    await sqlcommand.ExecuteNonQueryAsync()
}
catch
{
    Console.WriteLine("Failed");
}

这样的事情会起作用吗?有没有人有成功的故事?

1 个答案:

答案 0 :(得分:2)

如果负担如此之大,我建议分两步完成。首先将其读入临时表,然后从那里完成其余的工作。

如果文件位于SQL-Server有权访问的位置,则可以直接从T-SQL加载XML。

This question要求上传多个XML(使用CURSOR),但您会看到该怎么做。

This question解决了导出到XML的问题,但有关文件编码的几个重要事项需要了解。

This question涵盖了一些人可能陷入的陷阱。

一般

  • C#在任何情况下都使用unicode(2字节编码)作为字符串。这样的字符串可以传递给SQL Server的NVARCHAR(MAX)类型。如果XML格式正确,您可以将其直接传递给XML类型的变量。

  • SQL-Server在编码方面非常有限。这些大文件通常与utf-8一起存储。提供的链接提供了相关信息。

  • SQL-Server未按运行。如果它在另一台机器上运行,它将看到您看到的其他驱动器和路径。权利也可能不同。

  • 是否使用C#加载XML并将其传递给SQL-Server,或者如果您使用来自T-SQL的某些命令,那么数据必须完全相同,必须从A传送到B. / p>

  • 如果记忆很重要,你可能会将其分成几部分。