sql 读取数组问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 读取数组问题相关的知识,希望对你有一定的参考价值。
有两个有关联的表,表1是保存商品分类,表2是商品信息内容,因为每个商品对应的分类不是唯一的,如《ASP数据库完全开发手册》这本书又可以放到,“数据库”分类里,又可以放到“ASP”分类里。请问用sql语句怎么查询对应两个表关联的数据?如下是数据结构和要求生成的结果
id name
1 数据库
2 ASP
3 php
4 JSP
ID BookName TypeCode
1 ASP数据库开发 1,2
2 PHP数据库开发 1,2
查询结果如以
ASP数据库开发 数据库,ASP
PHP数据库开发 数据库,PHP
表2内容错了,改正一下
ID BookName TypeCode
1 ASP数据库开发 1,2
2 PHP数据库开发 1,3
mssql数据库
我现在遇到这种情况,就把它改成三张表,一张商品表,一张分类表,一张是商品与分类对应表,这样处理起来更方便 参考技术B 表设计有问题.不符合第2范式.所以查询起来比较麻烦.
如果增加一个表存放TypeCode 和BOOKID对应关系 就容易做了.
现在很麻烦.不过可以用个循环语句取出单个.TypeCode
----------------------为防审核---稍候贴答案----------------
declare @a int
,@b varchar(100)
,@c int
,@d int
declare mycursor cursor fast_forward
for select [id] from 表2
open mycursor
fetch mycursor into @d
set @a=0
set @c=1
set @b=''
while @@fetch_status=0
begin
while @c<=(select count(*) from 表1)
begin
select @a=substring(TypeCode,@c,1) from 表2
set @b=@b+(select [name] from 表1 where [id]=@a)+','
set @c=@c+2
end
fetch mycursor into @d
end
close mycursor
deallocate mycursor
set @b=left(@b,len(@b)-1)
set @b= 'select [ID],bookname '+ @b + ' from 表2'
EXEC (@b)
--越写越感觉麻烦. 参考技术C sql server啊,不太可能实现你说的查询结果,如果硬要实现,就得用到存储过程或是函数,但是哪样的效率就变低了。
你用下面这段查询,看一下它的结果,你就明白,你的ASP应该怎么写了。查询结果和你要的差不多的。
select table1.id,table1.name,table2.bookname,typecode from table1 left join table2
on table2.typecode like '%'+cast(table1.id as varchar(10))+'%'
---------------------
是access还是sql server?本回答被提问者采纳 参考技术D 首先,查询语句并不要求主键与外键,对于任何表结构的任何字段,本语句均可以正确执行。
其次,这样语句中主键与外键的要求,是根据一般关系数据库的实体含义得出的,比如你这个学生和选课表,学号就自然应该是学生表的主键、选课表的外键。
第三,为了语句的效率,这样种形式的语句一般要求学号在两个表中均有索引。 第5个回答 2008-04-16 不赞同楼上的说法,这种设计在现实很正常,但是一般看到的处理方式都是放到编程语言层上来实现的,不知道在数据库层能不能按楼主的方式处理,我也很期待答案
读取多级 XML 文件
【中文标题】读取多级 XML 文件【英文标题】:Reading Multi Level XML File 【发布时间】:2021-06-07 09:03:01 【问题描述】:我有一个 XML 文件,其中包含有关航行的所有信息和所有详细信息。
我想读取XML文件中的所有记录,合并记录后我想将它写入SQL数据库。
到目前为止,我安排将 header 、 company 和 voyage 放入数组,但将所有记录的详细信息放入数组中我失败了。
这是我要处理的任务:
通过 FileDialog 选择并读取任何 XML 数据到 RAM(已完成) 创建数组并将 XML 数据读取到数组(部分完成) 将 XML 数据写入 DataView(部分完成) 创建 T-SQL INSERT 命令(部分完成) 将数据写入数据库(等待完成早期步骤)从 XML 读取到 DataView 时,我可以将数据存入内存,但无法按要求分离多级数据。
确切的问题是尝试在我收到的每个 XML 文件中处理不同级别的 XML 数据。
foreach (var child in childElem.Elements("ManifestData"))
foreach(var x in child.Elements())
var checkName = x.Name.ToString();
switch (checkName)
case "Company":
Globals.Companys.Clear();
foreach (var y in x.Elements())
Globals.Companys.Add(y.Name.ToString(), y.Value.ToString());
break;
case "Voyage":
Globals.Voyages.Clear();
foreach (var y in x.Elements())
Globals.Voyages.Add(y.Name.ToString(), y.Value.ToString());
break;
case "BLs":
int recs = 0;
Globals.BL.Clear();
textBox2.Clear();
foreach (var y in x.Elements())
foreach (var z in x.Elements("units"))
Globals.Units.Add(y.Element("number").Value.ToString(), z.Value.ToString());
Globals.BL.Add(y.Element("number").Value.ToString(), y.Value.ToString());
recs = recs + 1;
textBox2.AppendText("\n" + y.ToString());
string output = string.Join("\n", Globals.BL);
MessageBox.Show(output);
break;
default:
break;
在我的示例 XML 中,您看到有 3 个 BL,所有 BL 数据都有不同的级别。可能有数百个 BL,具有不同级别的货物和危险品。
我在这里处理多级 XML 数据时遇到问题。
如果你能帮我解决这个非常基本的问题,我会很高兴。我希望学习并留给人们了解如何为自己的数据库制作桌面 XML 阅读器应用程序。
这是XML Data 示例 您可以在这里找到所有来源:Project Reading XMLbyC#
【问题讨论】:
请提供Minimal, Reproducible Example,而不是您的整个代码库。这里没有人会扫描您的整个代码以查找错误,您必须提供您的尝试以及具体您遇到的问题。 " 将任何 XML 数据读取到 RAM" 请向我们展示此代码。查看您的 XML 后,它似乎可以由类结构表示。然后你需要它的唯一代码described here 其余的是从你的表示类访问变量并分发它们。 我修复了我的帖子,我应该注意到你的观点。 【参考方案1】:xml 处理部分可以通过将 xml 反序列化为 c# 类来简化,然后您可以使用这些类来做任何您想做的事情。
[XmlRoot(ElementName = "ManifestMessage")]
public class ManifestMessage
[XmlElement(ElementName = "Header")]
public Header Header get; set;
[XmlElement(ElementName = "ManifestData")]
public ManifestData ManifestData get; set;
[XmlRoot(ElementName = "Header")]
public class Header
[XmlElement(ElementName = "sender")]
public string Sender get; set;
[XmlElement(ElementName = "reciever")]
public string Reciever get; set;
[XmlElement(ElementName = "timeOfDocument")]
public string TimeOfDocument get; set;
[XmlElement(ElementName = "typeOfMessage")]
public string TypeOfMessage get; set;
// Then when you want to get the xml deserialized into your class hierarchy
var xmlSerializer = new XmlSerializer(typeof(ManifestMessage));
var manifestMessage = xmlSerializer.Deserialize(data) as ManifestMessage;
// now you can use this object to drill down the whole hierarchy
Console.WriteLine(xmlData.Header.Sender);
Console.WriteLine(xmlData.ManifestData.Company.ComanyName);
Console.WriteLine(xmlData.ManifestData.Voyage.CrewNumber);
foreach (var bl in xmlData.ManifestData.BLs.BL)
Console.WriteLine(bl.Collect);
Console.WriteLine(bl.Consegnee.Name);
Console.WriteLine(bl.Customer.Name);
您可以使用https://xmltocsharp.azurewebsites.net/ 站点从您的 xml 生成整个 c# 类层次结构。
Console.WriteLine
仅用于演示目的,您可以根据需要采用它。
【讨论】:
感谢您的链接!非常非常有用!投赞成票 感谢链接和代码,我会检查并尝试调整我的代码,但我试图弄清楚如果 xml 发生变化如何处理(可以在 BLs 中看到它们不同记录级别)。在我的示例中,它是货物和危险品。 您可以将BLs
子项的所有不同组合添加到您的 xml 文件中,并让生成器为所有类生成类,但是您必须通过属性调整 xml 以使某些内容成为可选(如果它们是可选的)并不总是存在,例如[XmlRoot(ElementName = "AnotherBLChild", IsNullable = true)]
所以这是创建所有可能组合的最佳方式,当没有数据时,只需将 null 发送到数据库是一种选择;视野开阔。谢谢你的想法。
@melic 如果这回答了您的问题,请您标记答案。以上是关于sql 读取数组问题的主要内容,如果未能解决你的问题,请参考以下文章
无法从从 sql 数据库读取的 javascript 函数中获取返回数组 [重复]