SQLServer逗号分隔的字符串转换成表
SQLServer逗号分隔的字符串转换成表,大体上,步骤如下:
1、 创建一个临时表(使用当前连接的临时表,#tmp_table),临时表只有一字段,字段的类型根据要拆分字符串里的实际数据类型。
2、 利用SQLServer函数进行字符串拆分。
3、 将拆分后的数据写入到第1步中创建的临时表中。
4、 使用临时表进行查询、更新或者删除等操作。
5、 删除临时表。
以C#编程实现举例
案例背景说明:系统采用B/S架构,现有产品表(Product),其结构如下:
序号 | 字段名称 | 字段类型(长度) | 备注 |
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小时内删除。
发表评论