如何在SQL中的WHILE LOOP中创建代码,每个LOOP只执行一次?

时间:2012-08-31 05:24:42

标签: sql sql-server tsql

问题,我怎样才能使插入只执行9次?我说9因为这是@CN_COUNT的值。相反,这是执行9 * 9。任何帮助都会非常感激。

DECLARE @CN_COUNT INT
, @DATE VARCHAR(10) = CONVERT(VARCHAR(10), GETDATE(),101)
, @TIME VARCHAR(10) = CONVERT(VARCHAR(8), GETDATE(),114)


SELECT @CN_COUNT = COUNT(*) FROM CARTON_HEADER

DECLARE @CN INT
SET @CN = 1
WHILE (@CN  <= @CN_COUNT)
BEGIN
SET @CN = @CN + 1

INSERT INTO TM_CARTON(
    CN_NUMBER, CN_PICKTICKET, CN_LOAD_NUMBER, CN_SHIPMENT_NUMBER,         CN_PACKED_QTY, CN_TRACKING_NUMBER, 
    CN_ROUTE, CN_BOL, CN_MBOL, CN_PARCEL_NUMBER, CN_TRAILER_NUMBER, CN_CREATED_DATE, CN_CREATED_TIME)
SELECT 
    CN_NUMBER, CN_PICKTICKET, CN_LOAD_NUMBER, CN_SHIPMENT_NUMBER, CN_PACKED_QTY, CN_TRACKING_NUMBER, 
    CN_ROUTE, CN_BOL, CN_MBOL, CN_PARCEL_NUMBER, CN_TRAILER_NUMBER, @DATE, @TIME 
    FROM CARTON_HEADER WHERE CN_LOAD_NUMBER = '1000000002'

END
GO

以下是示例数据:

  CN_NUMBER      CN_STATUS  CN_LOAD_NUMBER
  1001333311111 85  1000000002
  1001333311112 85  1000000002
  1001333311114 85  1000000002
  1001333311113 85  1000000002
  1001333311115 85  1000000002
  1001333311116 85  1000000002
  1001333311117 85  1000000002
  1001333311118 85  1000000002
  1001333311119 85  1000000002

以上数据在表A中,我想将其复制到表B,其中CN_LOAD_NUMBER是我在声明中声明的内容

不好意思,伙计们,我说这比解决方案更复杂只是一个简单的INSERT语句,没有循环。

INSERT INTO TM_CARTON(
CN_NUMBER, CN_PICKTICKET, CN_LOAD_NUMBER, CN_SHIPMENT_NUMBER,         CN_PACKED_QTY, CN_TRACKING_NUMBER, 
CN_ROUTE, CN_BOL, CN_MBOL, CN_PARCEL_NUMBER, CN_TRAILER_NUMBER, CN_CREATED_DATE, CN_CREATED_TIME)
SELECT 
CN_NUMBER, CN_PICKTICKET, CN_LOAD_NUMBER, CN_SHIPMENT_NUMBER, CN_PACKED_QTY, CN_TRACKING_NUMBER, 
CN_ROUTE, CN_BOL, CN_MBOL, CN_PARCEL_NUMBER, CN_TRAILER_NUMBER, @DATE, @TIME 
FROM CARTON_HEADER WHERE CN_LOAD_NUMBER = '1000000002'

1 个答案:

答案 0 :(得分:4)

您发布的代码只会执行9次。 如果您获得的插入次数超出了您的预期,那是因为select语句返回的行数超过了一行。

在第一个循环之后,您将复制该行。因此,循环的每次连续迭代将返回n + n行,其中n是前一次迭代返回的行数。

你到底想要做什么?