本人菜鸟一枚,大神绕道,在工作中遇到这个问题,再网上找了很多方案都行不通,在本身项目中找到解决方法,记录下来,以免忘记,这个很早就写了一直放在群论坛只能群内部访问,现在转移到博客园也是给遇到同样问题的童鞋一个思路
声明:本人只在SQL2008R2测试通过,其他更低版本请自行测试
正文:
在开发中有时候会碰到一条数据涉及多个外键表的数据看下表:
表1:Type,表2:Data
思路:
将表2中的TypeID分割字符串,但在目前的MSSQL中没有分割字符串的函数或是存储过程,那么要自己编写一个表值函数,以下是创建函数代码:
create function
dbo.F_Split
(
@str nvarchar(max),--原始字符串
@key varchar(10)--分割字符
)
returns @temp table(Item varchar(100))
as
begin
declare @i int--定义索引
set @str=rtrim(ltrim(@str))--去掉前后空格
set @i=charindex(@key,@str)--返回key在str中的索引
while @i>=1--循环添加
begin
insert @temp
values(left(@str,@i-1))--截取索引前的字符串并添加在临时表中
set
@str=substring(@str,@i+1,len(@str)-@i)--将str重新赋值,截取已经存放在临时表的值
set @i=charindex(@key,@str)--再次取索引
end
if @str<>‘‘--如果str不为空
insert @temp values(@str)--添加到临时表
return--返回
end
得到分割函数之后将表2中的TypeID分割,查询,替换,以下是参考T-SQL
select ID,
REPLACE(--替换‘ ‘为‘,‘
LTRIM(--去掉左空格或制表符
CONVERT(nvarchar(max),--转换格式
(
select ‘ ‘+TypeName from Type --查询类型表
where ID IN(
select item from F_Split(TypeID,‘,‘)--分割字符串返回临时表
) For xml path (‘‘) --将列转换成行数据
)
)
),‘ ‘,‘,‘) TypeID
,Remarks
from Data
查询结果:
得到查询结果正确。
---------------------------------------------------------------------END------------------------------------------------------------------------------
PS:如有不对或者错误欢迎指正!
关于在MSSQL中一个列值保存多个外键使用T-SQL单条查询的解决办法,古老的榕树,5-wow.com