SQLServer逗号分隔的字符串转换成表
SQLServer逗号分隔的字符串转换成表,大体上,步骤如下:
1、 创建一个临时表(使用当前连接的临时表,#tmp_table),临时表只有一字段,字段的类型根据要拆分字符串里的实际数据类型。
2、 利用SQLServer函数进行字符串拆分。
3、 将拆分后的数据写入到第1步中创建的临时表中。
4、 使用临时表进行查询、更新或者删除等操作。
5、 删除临时表。
以C#编程实现举例
案例背景说明:系统采用B/S架构,现有产品表(Product),其结构如下:
sql 字符串转数组
序号
字段名称
字段类型(长度)
备注
ID
Int
IDENTITY(1,1) NOT NULL
ProductCode
Varchar(30)
ProductName
NVarchar(100)
State
Int
数据状态(0-未审核,1-已审核)
。。。
在客户端,请求将批量选中的行标识为【审核通过】。
我们可以这样做,将批量选中的行的ID用逗号分隔连接成一个ID串,发送到服务端,服务端进行处理。处理代码大致如下(和上述步骤对应):
        public static int ShenHe(string ids, string tableName)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                {
                    SqlCommand cmd = new SqlCommand();
                    try
                    {
                        cmd.Connection = conn;
                        StringBuilder cmdText = new StringBuilder();
                        cmdText.AppendFormat("create table #tmp_table(ID int);");
                        string[] idAry = ids.Split(',');
                        foreach (string id in idAry)
                        {
                            cmdText.AppendFormat("\ninsert into #tmp_table(ID) values({0});", id);
                        }
                        cmdText.AppendFormat("\nupdate {0} set State = 1 where ID in (select ID from #tmp_table);", tableName);
                        cmdText.AppendFormat("\ndrop table #tmp_table;");
                        cmd.CommandText = cmdText.ToString();
                        int effect = cmd.ExecuteNonQuery();
                        return effect;
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
            return -1;
        }
当然上述转换过程,完全可以写成一个函数。
create function f_split(@SourceSql varchar(8000))
returns @temp table(a varchar(100))
as
begin
    declare @i int
    set @SourceSql=rtrim(ltrim(@SourceSql))
    set @i=charindex(',',@SourceSql)
    while @i>=1
    begin
        insert @temp values(left(@SourceSql,@i-1))
        set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
        set @i=charindex(',',@SourceSql)
    end
    if @SourceSql<>','
      insert @temp values(@SourceSql)
    return
end
用法 select * from dbo.f_split('abcd,efg,mm')
值得说明的是,当要分割的字符串非常长,上述函数第一个参数建议改成ntext,这样不受字符数的限制。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。