需要将多个表中创建的数据转换为1个表

时间:2013-03-23 23:59:38

标签: xml split insert create-table insert-update

我对SQL比较陌生,可以使用一些帮助。我把代码片段混合在一起,这些代码片段帮助我接近了我的目标,但没有实现它。我原始数据的基本内容如下:

  • 产品 - Qty_Shipping
  • P65238 - - - - - 4
  • P65236 - - - - - 2
  • P65240 - - - - - 3

我想要最终得到的要点如下:

  • 产品 - UCC代码
  • P65238 - - 001475010
  • P65238 - - 001475011
  • P65238 - - 001475012
  • P65238 - - 001475013
  • P65236 - - 001475014
  • P65236 - - 001475015
  • P65240 - - 001475016
  • P65240 - - 001475017
  • P65240 - - 001475018

必须为每件货物分配一个唯一的UCC代码(起始于:001475010)。以下是根据订购产品总数创建许多独特UCC的代码。

CREATE TABLE #TEMP(UCCs INT) 

DECLARE @UCC INT
    ,@textXML XML
    ,@data NVARCHAR(MAX) 
    ,@delimiter NVARCHAR(5)
    ,@ConCatString NVARCHAR(MAX)
    ,@LoopCounter INT
SET @ConCatString = ''
SET @UCC = 001475009 + 1
SET @LoopCounter = (
SELECT CAST(Q.DSPTOTQTY_0 AS INT)
FROM x3v6prem.PILOTNEW.SDELIVERY Q
WHERE Q.SOHNUM_0 = 'SO1300259')
IF @LoopCounter = 1 GOTO Skip_Loop
Continue_Loop:
SET @ConCatString = @ConCatString + CAST(@UCC AS NVARCHAR(MAX)) + ','
SET @UCC = @UCC + 1
SET @LoopCounter = @LoopCounter -1
IF @LoopCounter > 1 GOTO Continue_Loop
Skip_Loop:
SET @ConCatString = @ConCatString + CAST(@UCC AS NVARCHAR(MAX)) 

SELECT @data = @ConCatString,
    @delimiter = ','
SELECT    @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML)
INSERT INTO #TEMP
SELECT  T.split.value('.', 'nvarchar(max)') AS data
FROM    @textXML.nodes('/d') T(split)

SELECT * FROM #TEMP
DROP TABLE #TEMP

接下来是根据所发货产品的数量多次复制产品ID的代码。最后,数据将用于创建一个运输标签,该标签将放置在每个订购的产品盒上,并为每个盒子显示唯一的(条形码)编号。

CREATE TABLE #TEMP2(Products NVARCHAR(MAX)) 

DECLARE @Item2 NVARCHAR(MAX)
    ,@textXML2 XML
    ,@data2 NVARCHAR(MAX) 
    ,@delimiter2 NVARCHAR(5)
    ,@ConCatString2 NVARCHAR(MAX)
    ,@LoopCounter2 INT
    ,@LastLine2 INT
DECLARE CC CURSOR LOCAL FAST_FORWARD FOR
SELECT T.ITMREF_0
FROM x3v6prem.PILOTNEW.SDELIVERYD T
WHERE T.SOHNUM_0 = 'SO1300259'
ORDER BY T.SDDLIN_0
OPEN CC
SET @ConCatString2 = ''
SET @LastLine2 = (
SELECT CAST(L.DSPTOTQTY_0 AS INT)
FROM x3v6prem.PILOTNEW.SDELIVERY L
WHERE L.SOHNUM_0 = 'SO1300259')
GetNextItem2:
FETCH NEXT FROM CC INTO @Item2
IF @@FETCH_STATUS <> 0 GOTO EndBothLoops2
SET @LoopCounter2 = (
SELECT CAST(Q.QTY_0 AS INT)
FROM x3v6prem.PILOTNEW.SDELIVERYD Q
WHERE Q.SOHNUM_0 = 'SO1300259' AND Q.ITMREF_0 = @Item2)
Continue_Loop2:
IF @LoopCounter2 = 0 AND @LastLine2 > 1 GOTO GetNextItem2
SET @ConCatString2 = @ConCatString2 + CAST(@Item2 AS  NVARCHAR(MAX)) + ','
SET @LoopCounter2 = @LoopCounter2 - 1
SET @LastLine2 = @LastLine2 - 1
IF @LoopCounter2 > 0 AND @LastLine2 > 1 GOTO Continue_Loop2
IF @LoopCounter2 = 0 AND @LastLine2 > 1 GOTO GetNextItem2
SET @ConCatString2 = @ConCatString2 + CAST(@Item2 AS NVARCHAR(MAX))
EndBothLoops2:
CLOSE CC
DEALLOCATE CC
SELECT @data2 = @ConCatString2
   ,@delimiter2 = ','
SELECT    @textXML2 = CAST('<d>' + REPLACE(@data2, @delimiter2, '</d><d>') + '</d>' AS XML)

INSERT INTO #TEMP2
SELECT  T.split.value('.', 'nvarchar(max)') AS data
FROM    @textXML2.nodes('/d') T(split)

SELECT * FROM #TEMP2
DROP TABLE #TEMP2

如果我可以简单地弄清楚如何将我已经放入两个单独的表中的输出放到一个表中,我的问题就会解决,我可以(我相信)管理其余的。我没有使用我正在使用的XML代码的实际经验,所以我无法辨别如何在创建的表中插入多个列。
其他较小的问题:我似乎无法以他们将保持领先零的方式格式化UCC值

1 个答案:

答案 0 :(得分:0)

看起来我能解决自己的问题。我终于能够使用IDENTITY关键字向我创建的表添加第二个字段。在这一点上,我仍然不确定为什么我能够添加这个字段而不是其他,但我会接受它!我写的代码仍然可能非常不灵活,所以如果有人想帮助我让代码运行得更好,我会非常感激!谢谢!