SQL Server 2008从逗号分隔值中选择列

SQL Server 2008从逗号分隔值中选择列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,表1: Id | Name 1 | Example1 2 | Example2 表2: Id | Table1_IDs 1 | 1,2 2 | 2 我想使用table1\u ID从table2中选择table1,如: 您可以构建查询字符串end,然后使用sp_executesql存储过程来运行它。像这样的东西没有经过测试 declare @ids varchar(2000) select @ids = coalesce(@ids + ',', '') + convert(va

表1:

Id | Name
1  | Example1
2  | Example2
表2:

Id  | Table1_IDs
1   | 1,2
2   | 2
我想使用table1\u ID从table2中选择table1,如:


您可以构建查询字符串end,然后使用sp_executesql存储过程来运行它。像这样的东西没有经过测试

declare @ids varchar(2000)
select @ids = coalesce(@ids + ',', '') +  convert(varchar(100), table1_IDs)
from table2

declare @query nvarchar(2000) = 'select * from table1 where id in (' + @ids + ')'
execute sp_executesql @query
但使用彗差分离值不是个好主意,因为它会降低性能。尝试重构您的表


还有其他相同结构的选项吗


将表2逗号删除后拆分为行,并在联接中与表1一起使用。

不要将数据存储为逗号分隔的项,这只会给您带来很多麻烦。。。每行一个值就是SQL方式!在这种情况下,您需要像这样重新构造表:table1Id,Name,ID是主键。表2id,id\u-ref带有复合主键id,id\u-ref。请问您想要实现什么?还有其他相同结构的选项吗?像子查询或函数等…这可能是可行的,但性能不好。
declare @ids varchar(2000)
select @ids = coalesce(@ids + ',', '') +  convert(varchar(100), table1_IDs)
from table2

declare @query nvarchar(2000) = 'select * from table1 where id in (' + @ids + ')'
execute sp_executesql @query
select * from table1 ta join
    (
    SELECT id,  
         LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs
          from  (

    SELECT id,CAST('<XMLRoot><RowData>' + REPLACE(value,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
    FROM   table2

)  t 
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)) b on b.id=ta.id