有一个表格不幸以下列格式设计(最多39个而不是3个):
表:Joined_Table
Key Nm_1 Nm_2 Nm_3 Age1 Age2 Age3 State1 State2 State3
1 Bob Sally John 12 13 14 Fl. AL. NY.
2 Jack Billy Jean 15 15 83 AL. TX. WA.
在开始SharePoint迁移之前,我需要将这些项目行单独添加到单个项目中。我需要将数据复制到另一个表格,类似于这种格式:
表:dbo.Line_Items
K FK Name_T Age_T State_T
1 1 Bob 12 Fl.
2 1 Sally 13 AL
3 1 John 14 NY
4 2 Jack 15 AL
5 2 Billy 15 TX
6 2 Jean 83 WA
有人被告知考虑使用“交叉申请”,我打算这样做,但我想知道是否有其他人有经验或建议以干净的方式做到这一点(记住这最多39)。我不需要非常动态的东西,因为我不介意不得不输入每个列类型39次。 例如,我正在考虑创建表,然后在Nm_1,Age1,State1上为每行插入一行,然后用2替换1,等等。但即使使用此方法,我也不确定如何创建新行原始表中所有行实例的Nm_1,Age1和State1。
答案 0 :(得分:1)
交叉申请是一个非常干净的解决方案
select
key = row_number() over(order by fk, k),
fk,
name_t,
age_t,
state_t
from tbl
cross apply (
values
(1, key, nm_1, age1, state1),
(2, key, nm_2, age2, state2),
-- ...
(39, key, nm_39, age39, state39)
) c (k, fk, name_t, age_t, state_t)
答案 1 :(得分:0)
我知道这不是最干净或最有效的,但它适用于我的简单案例。 我使用动态字符串来存储SQL语句,使用while循环来遍历39行中的每一行:
DECLARE @MyQuery nvarchar(MAX)
DECLARE @MyInt int
SET @MyInt = 1
WHILE @MyInt <= 39
BEGIN
SET @MyQuery = 'INSERT INTO dbo.[Line_Items]
(FK, Name_T, Age_T, State_T)
SELECT [Key], [Nm_1], [Age1], [State1]
FROM dbo.Joined_Table
WHERE LTRIM(RTRIM(Nm_1)) NOT LIKE ''''
ORDER BY ID
'
SET @MyQuery = REPLACE(@MyQuery,1,@MyInt)
SET @MyInt = @MyInt+1
EXEC(@MyQuery)
END
`