关于在MSSQL中一个列值保存多个外键使用T-SQL单条查询的解决办法

本人菜鸟一枚,大神绕道,在工作中遇到这个问题,再网上找了很多方案都行不通,在本身项目中找到解决方法,记录下来,以免忘记,这个很早就写了一直放在群论坛只能群内部访问,现在转移到博客园也是给遇到同样问题的童鞋一个思路

声明:本人只在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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。