如何将xml字符串加载到sql server

如何将xml字符串加载到sql server,xml,sql-server-2012,visual-studio-2010,Xml,Sql Server 2012,Visual Studio 2010,我几天来一直试图找到这个问题的答案,但似乎找不到答案 我有一个从web服务获取的xml字符串,需要存储在sql server 2012中 xml字符串可以大到100k 我有下表 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[TempXML]( [id] [uniqueidentifier] ROWGUIDCOL NOT NULL, [MyXML] [v

我几天来一直试图找到这个问题的答案,但似乎找不到答案

我有一个从web服务获取的xml字符串,需要存储在sql server 2012中

xml字符串可以大到100k

我有下表

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[TempXML](
[id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
[MyXML] [varbinary](max) NOT NULL,
CONSTRAINT [PK_TempXML] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,         ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[TempXML] ADD  CONSTRAINT [DF_TempXML_id]  DEFAULT (newid()) FOR [id]
GO
以及以下存储过程

CREATE PROCEDURE [dbo].[InsertXML] 
(   @xml xml)

AS  
BEGIN

SET NOCOUNT ON;
Insert into TempXML
values(NEWID(), @xml)
END 
当我调用存储过程时,如果数据大小大于43752个字符,它会删除数据并只安装id

另一方面,如果字段设置为nvarchar(max),则在删除整个字符串之前,我可以加载的最大字符数为65535个字符

我正在从c#方法调用存储过程

内部静态void InsertTempMovie(字符串xml)
{
{
xmlsource=xmlsource.Replace(“&”和“&”);
xmlsource=xmlsource.Replace(“'”,“'”);
xmlsource=xmlsource.Replace(“,”);
字符串xmlSouceEncoded=HttpUtility.HtmlDecode(xmlSouce);
LinQTestDataContext dbTempXML=新的LinQTestDataContext();
ExecuteCommand(“exec InsertTempXML@xml={0}”,xmlSouceEncoded);
}
}
但是,即使直接从sql server 2012 management studio调用,也会得到相同的结果

有没有关于我可以上传整个字符串而不被删除的想法


提前感谢您

我的第一个建议是:既然您有XML数据,并且希望存储它,那么就将其存储为
XML
!为什么要将其转换为
varbinary
?XML不是二进制数据

因此,将表定义更改为:

CREATE TABLE [dbo].[TempXML]
(
    [id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [MyXML] [XML] NOT NULL,

    CONSTRAINT [PK_TempXML] 
    PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
接下来,您可以只使用普通ADO.NET将这些XML文件插入到数据库中,如下所示:

// define connection and command in using blocks to ensure proper disposal
using(SqlConnection conn = new SqlConnection(yourConnectionString))
using (SqlCommand cmdInsert = new SqlCommand("dbo.InsertXML", conn))
{
    cmdInsert.CommandType = CommandType.StoredProcedure;

    // define your parameters
    cmdInsert.Parameters.Add("@xml", SqlDbType.Xml, int.MaxValue);

    // set the parameter values
    string xmlContents = File.ReadAllText(@"...path to your XML file here.....");
    cmdInsert.Parameters["@xml"].Value = xmlContents;

    // open connection, execute command, close connection
    conn.Open();
    int affected = cmdInsert.ExecuteNonQuery();
    conn.Close();
 }
或者,如果您正在使用Linq to SQL,则将您正在使用的存储过程导入到Linq to SQL数据上下文模型中,然后在模型的
DataContext
类上调用该存储过程:

// use your DataContext class here - in a using block
using (DataClasses1DataContext ctx = new DataClasses1DataContext())
{
    // load your XML document from a file
    XDocument doc = XDocument.Load(@"....path to your XML file here.....");

    // call the stored procedure that's defined on your DataContext class
    ctx.ProcInsertXML(doc.Root);
}

通过这两种方法,我都能够将非常大的XML(500 KB-2.5 MB)插入SQL Server而没有任何问题。

如果您的数据是
XML
,并且您的参数是
XML
-为什么要将数据存储为
Varbinary
??毫无意义。。。。XML数据不是二进制数据-在这里似乎是一个非常糟糕的表结构选择…仅使用基本的ADO.NET,我就可以轻松地将450-550K XML文档插入数据库表中的
XML
列中。一定是其他原因导致了这些问题……您如何访问SQL Server数据库?您使用的是LINQtoSQL还是实体框架?哪个版本?好吧,关于varbinary我犯了个错误,我一直在努力让它正常工作,但在编写脚本并发布它之前忘记了将feild更改回原来的版本。很好的调用和我的道歉,你可以从上面的代码中看到,我正在使用Linq访问我的sql Server。这不是一个文件!这是一个字符串。请参阅上面调用存储过程的方法。这不是问题所在。。。我可以上传的字符数量的限制是…使用XDocument doc=XDocument.Load(xmlString)我得到错误“无效URI:URI字符串太长”。@user662673:如果它是XML字符串,那么您需要使用
XDocument doc=XDocument.Parse(-此处是您的XML字符串)取而代之;
Load
方法需要一个文件名,而不是一个完整的XML字符串……对不起,我有点傻,我纠正了XDocument.Parse的错误,但仍然得到了相同的结果。。。数据库中的xml列中没有任何内容我只是注意到,我检查xml列填充的方式是从表上子菜单的初始select top 200中直观地查看列。然而,这并没有表明什么。但是如果我从我的表中选择xml,它会显示到数据的链接。。。耶。。。如果这项无Usless MS功能由MS OK thank to all发布,那就太好了。它看起来像是分类好的thank to all,但要特别感谢marc_s
// use your DataContext class here - in a using block
using (DataClasses1DataContext ctx = new DataClasses1DataContext())
{
    // load your XML document from a file
    XDocument doc = XDocument.Load(@"....path to your XML file here.....");

    // call the stored procedure that's defined on your DataContext class
    ctx.ProcInsertXML(doc.Root);
}