【发布时间】:2017-01-18 12:01:33
【问题描述】:
我正在尝试使用带有 XML 解析的查询来过滤表中的列。这个查询是用 C# 编写的,我正在使用 SQLDataAdapter 来执行查询。我的代码如下:
string sqlstring = $@"select * from [AS_GOV_PS_oud] inner join [AS_GOV_PStest13_1_2017v2]
on
[AS_GOV_PStest13_1_2017v2].[I/O name] = 'ST' where
cast('<a>' + replace([AS_GOV_PS_oud].Interconnection, '\""', ' </ a >< a > ') + ' </ a > ' as xml).query('for $x in / a order by $x return string($x)').value(' / ', 'varchar(max)') =
cast('<a>' + replace([AS_GOV_PStest13_1_2017v2].Interconnection, '\""', ' </ a >< a > ') + ' </ a > ' as xml).query('for $x in / a order by $x return string($x)').value(' / ', 'varchar(max)') ";
string cn = ConfigurationManager.ConnectionStrings["Scratchpad"].ConnectionString;
using (SqlConnection myConnection = new SqlConnection(cn))
{
SqlDataAdapter dataadapter = new SqlDataAdapter(sqlstring, myConnection);
}
错误代码如下:
System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常
附加信息:XML 解析:第 1 行,字符 33,非法限定名字符
【问题讨论】:
-
使用 SQL Server 附带的 SQL Server Management Studio (SSMS) 在 C# 中使用之前使 SQL 语句正常工作。 SSMS 中的错误信息比 c# 好很多。
-
@jdweng,这告诉我完全一样:
XML parsing: line 1, character 33, illegal qualified name character -
@wouterdejong 我刚刚找到了你的previous question,并且对你想要什么有了更好的理解。但主要问题是:为什么一列中有 CSV 数据? 这破坏了 1NF...如果您没有充分的理由这样做,您应该将其存储在真正的 XML 中,或者 - 根据您的需要 - 在相关的边表中。在一列中放置多个值是一个巨大的设计缺陷......
-
@wouterdejong:顺便说一句:如果一个元素可以存在多次,那么您将其作为排序字符串加入的想法将会中断。想象一下
A"B"C在一张桌子上,B"A"C"A在第二张桌子上。相同的值,但ABC将不等于AABC... CSV 数据往往是模糊的... -
@wouterdejong 还有一件事要考虑:如果分隔值可以 - 任何机会 - 包括禁止字符,如
<, > or &或许多特殊(非纯拉丁)字符(如This"is"fobidden & ugly"don't do it)简单的 XML 拆分会崩溃...
标签: c# sql-server xml