Hy那里!
所以我们在域中有一些数组。
例如[ 123, 234, 345 ]
当我们要针对SQL Server查询时,我们通常会将此数组转换为123,234,345
(字符串),以便我们可以执行类似的操作(使用字符串替换):
SELECT *
FROM [dbo].[myTable]
WHERE [myColumn] IN (123,234,345)
这很简单,即使WHERE [myColumn] = 123 OR ...
在性能方面会更好。
这种(转换方式)是将数组从域转移到数据库的唯一方法。
现在我需要做一个连接,将这个数组转换成一个表。我想到的第一件事就是我可以在域内创建一个XML并以某种方式对其进行转换。你能给我一些如何做的例子,甚至更好的解决方案吗?
答案 0 :(得分:2)
我确信您可以使用逗号分隔字符串而不是parse into table。
但我建议用这样的ids发送xml:
<query id="59bd6806-d28c-451a-8473-69f1432e46b2">
<ids>
<id>1</id>
</ids>
</query>
而不是解析成表:
CREATE FUNCTION [dbo].[GetQueryIdsTable]
(
@query xml
)
RETURNS @ids TABLE (id INT, ItemOrder INT)
AS
BEGIN
INSERT INTO @ids (ID, ItemOrder) SELECT Ids.Id.value('.','int'), ROW_NUMBER() OVER(ORDER BY ROWCOUNT_BIG()) AS ItemOrder
FROM @query.nodes('/query/ids/id') as Ids(Id)
RETURN
END
解析后即可加入。
在服务器端,我使用Xml构建器,如下所示:
public class Query
{
private List<string> Ids = new List<string>();
public void AddId(Int32 id)
{
if (Ids.Contains(id.ToString()))
return;
Ids.Add(id.ToString());
}
public String ToXmlString()
{
var idsElement = new XElement("ids");
foreach (var id in Ids)
{
idsElement.Add(new XElement("id", id));
}
XElement query = new XElement("query",
new XAttribute("id", Guid.NewGuid().ToString()),
idsElement
);
return query.ToString();
}
}
我喜欢xml,因为你可以在sql server上轻松解析你想要的东西。