如何在SQL Server中使用逗号分隔字符串

时间:2010-12-28 08:21:21

标签: sql-server sql-server-2005

Hy那里!

所以我们在域中有一些数组。

例如[ 123, 234, 345 ]

当我们要针对SQL Server查询时,我们通常会将此数组转换为123,234,345(字符串),以便我们可以执行类似的操作(使用字符串替换):

SELECT    *
FROM      [dbo].[myTable]
WHERE     [myColumn] IN (123,234,345)

这很简单,即使WHERE [myColumn] = 123 OR ...在性能方面会更好。

这种(转换方式)是将数组从域转移到数据库的唯一方法。

现在我需要做一个连接,将这个数组转换成一个表。我想到的第一件事就是我可以在域内创建一个XML并以某种方式对其进行转换。你能给我一些如何做的例子,甚至更好的解决方案吗?

1 个答案:

答案 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上轻松解析你想要的东西。