将从字符串中提取的值动态插入到具有多个实例的表中

时间:2017-11-16 12:27:54

标签: sql sql-server

我目前面临以下难题。

我需要转换它:

@string = 'TM_15 <= 0.574803 AND TM_3 <= 0.4 AND TM_9 <= 0.298738 AND TM_8 <= 0.30605 
AND TM_16 <= 0.367816 AND TM_12 <= 0.341463 AND TM_10 <= 0.379487 AND TM_4 <= 0.44186 
AND TM_2 <= 0.45 AND TM_7 <= 0.247525 AND TM_1 <= 0.6 AND TM_13 <= 0.28 AND TM_5 <= 0.285714 
AND TM_11 <= 0.6 AND TM_6 <= 0.448276 AND TM_15 <= 0.285047 AND TM_14 <= 0.6 
AND TM_12 <= 0.248366 AND TM_5 <= 0.245399 AND TM_16 <= 0.09375 AND TM_3 <= 0.372093 
AND TM_15 <= 0.199713 AND TM_10 <= 0.326996 AND TM_9 <= 0.248731 AND TM_8 <= 0.279412 
AND TM_13 <= 0.248577 AND TM_4 <= 0.311475 AND TM_2 <= 0.145833 AND TM_7 <= 0.213483 
AND TM_11 <= 0.199029 AND TM_4 <= 0.165289'

进入类似于此的东西:

TM_0    TM_1        TM_2        TM_3        TM_4        TM_5    ... and on to 16
        <= 0.6      <= 0.45     <= 0.4      <= 0.44186  <= 0.285714 
                    <= 0.145833 <= 0.372093 <= 0.311475 <= 0.245399 
                                            <= 0.165289     

我设法将值删除到各自的列和值中。我似乎无法插入表/表变量,它将尽可能小。我不希望找到一个包含超过30个条目的大型表格。理想情况下,对于上面的示例字符串值,最大表列数应为17,行数为4.其中左上空间为空或空白。

原因是在完成之后,该列将减少到最小值。

请发布任何建议或想法。

感谢

1 个答案:

答案 0 :(得分:0)

绝对不知道你为什么要这样做,但你可以使用你选择的字符串拆分功能在你的问题中得到输出,如Sean Lange和pivot的评论中提到的,你可以从中{ {1}}进入表格等:

insert

输出:

declare @string nvarchar(1000) = 'TM_15 <= 0.574803 AND TM_3 <= 0.4 AND TM_9 <= 0.298738 AND TM_8 <= 0.30605 
AND TM_16 <= 0.367816 AND TM_12 <= 0.341463 AND TM_10 <= 0.379487 AND TM_4 <= 0.44186 
AND TM_2 <= 0.45 AND TM_7 <= 0.247525 AND TM_1 <= 0.6 AND TM_13 <= 0.28 AND TM_5 <= 0.285714 
AND TM_11 <= 0.6 AND TM_6 <= 0.448276 AND TM_15 <= 0.285047 AND TM_14 <= 0.6 
AND TM_12 <= 0.248366 AND TM_5 <= 0.245399 AND TM_16 <= 0.09375 AND TM_3 <= 0.372093 
AND TM_15 <= 0.199713 AND TM_10 <= 0.326996 AND TM_9 <= 0.248731 AND TM_8 <= 0.279412 
AND TM_13 <= 0.248577 AND TM_4 <= 0.311475 AND TM_2 <= 0.145833 AND TM_7 <= 0.213483 
AND TM_11 <= 0.199029 AND TM_4 <= 0.165289'

select r
      ,[TM_0]
      ,[TM_1]
      ,[TM_2]
      ,[TM_3]
      ,[TM_4]
      ,[TM_5]
      ,[TM_6]
      ,[TM_7]
      ,[TM_8]
      ,[TM_9]
      ,[TM_10]
      ,[TM_11]
      ,[TM_12]
      ,[TM_13]
      ,[TM_14]
      ,[TM_15]
      ,[TM_16]
from (
    select row_number() over (partition by left(s.item,charindex(' ',s.item,1)-1) order by s.rn) as r
          ,left(s.item,charindex(' ',s.item,1)-1) as c
          ,substring(s.item,charindex(' ',s.item,1)+1,9999) as v
    from dbo.fn_StringSplitMax(@string,'and ',null) as s
    ) as s
pivot (max(s.v) for c in([TM_0]
                        ,[TM_1]
                        ,[TM_2]
                        ,[TM_3]
                        ,[TM_4]
                        ,[TM_5]
                        ,[TM_6]
                        ,[TM_7]
                        ,[TM_8]
                        ,[TM_9]
                        ,[TM_10]
                        ,[TM_11]
                        ,[TM_12]
                        ,[TM_13]
                        ,[TM_14]
                        ,[TM_15]
                        ,[TM_16]
                        )
      ) as p
order by r

字符串拆分功能:

+---+------+---------+--------------+----------------+---------------+----------------+--------------+----------------+----------------+--------------+--------------+--------------+--------------+--------------+-----------+--------------+--------------+
| r | TM_0 |  TM_1   |     TM_2     |      TM_3      |     TM_4      |      TM_5      |     TM_6     |      TM_7      |      TM_8      |     TM_9     |    TM_10     |    TM_11     |    TM_12     |    TM_13     |   TM_14   |    TM_15     |    TM_16     |
+---+------+---------+--------------+----------------+---------------+----------------+--------------+----------------+----------------+--------------+--------------+--------------+--------------+--------------+-----------+--------------+--------------+
| 1 | NULL | <= 0.6  | <= 0.45      | <= 0.4         | <= 0.44186    | <= 0.285714    | <= 0.448276  | <= 0.247525    | <= 0.30605     | <= 0.298738  | <= 0.379487  | <= 0.6       | <= 0.341463  | <= 0.28      | <= 0.6    | <= 0.574803  | <= 0.367816  |
| 2 | NULL | NULL    | <= 0.145833  | <= 0.372093    | <= 0.311475   | <= 0.245399    | NULL         | <= 0.213483    | <= 0.279412    | <= 0.248731  | <= 0.326996  | <= 0.199029  | <= 0.248366  | <= 0.248577  | NULL      | <= 0.285047  | <= 0.09375   |
| 3 | NULL | NULL    | NULL         | NULL           | <= 0.165289   | NULL           | NULL         | NULL           | NULL           | NULL         | NULL         | NULL         | NULL         | NULL         | NULL      | <= 0.199713  | NULL         |
+---+------+---------+--------------+----------------+---------------+----------------+--------------+----------------+----------------+--------------+--------------+--------------+--------------+--------------+-----------+--------------+--------------+