1

我想这对于任何了解 SQL 编程的人来说都是一件非常容易的事情......

SQLFiddle

这是我对数据库执行的代码:

DECLARE @maxCounter int
-- Used to get the maximum bound number for my loop, basically what is the highest number of records. Tested, seems to work as expected.
SET @maxCounter = (SELECT TOP 1 COUNT(SN)
                   FROM TestResults 
                   WHERE Type = 'EX'
                   GROUP BY SN
                   ORDER BY COUNT(SN) DESC)

CREATE TABLE #Info
(
    DLoc VARCHAR(500),
    DCode VARCHAR(500),
    Dobs VARCHAR(500)
)

DECLARE @counter INT
SET @counter = 1

WHILE @counter <= @maxCounter 
BEGIN
    INSERT INTO #Info (DLoc) 
    VALUES ('Location_' + CAST(@counter AS VARCHAR(16)))

    INSERT INTO #Info (DCode) 
    VALUES ('Code_' + CAST(@counter AS VARCHAR(16)))

    INSERT INTO #Info (Dobs) 
    VALUES ('Observation_' + CAST(@counter AS VARCHAR(16)))

    SET @counter = @counter + 1
END

SELECT * FROM #Info;

DROP TABLE #Info;

如果您在代码中看到一些奇怪的东西,那是因为我是一个完全的初学者并且不知道更好。

while 循环的预期输出:

+------------+---------+---------------+
| defLoc     | defCode | obs           |
+------------+---------+---------------+
| Location_1 | Code_1  | Observation_1 |
| Location_2 | Code_2  | Observation_2 |
| Location_3 | Code_3  | Observation_3 |
+------------+---------+---------------+

意外的输出结果:

defLoc           | defCode     | obs           |
-----------------+-------------+---------------|
Location_1       |             |               |
                 | Code_1      |               |
                 |             | Observation_1 |
Location_2       |             |               |
                 | Code_2      |               |
                 |             | Observation_2 |
Location_3       |             |               |
                 | Code_3      |               |
                 |             | Observation_3 |

我不知道空单元格是从哪里来的......

4

2 回答 2

1

您需要为每次迭代使用ONE ,并一次性指定 所有三列及其值:INSERT

WHILE @counter <= @maxCounter 
BEGIN
    INSERT INTO #Info (DLoc, DCode, Dobs) 
    VALUES ('Location_' + CAST(@counter AS VARCHAR(16)),  
            'Code_' + CAST(@counter AS VARCHAR(16)),
            'Observation_' + CAST(@counter AS VARCHAR(16))
           )

    SET @counter = @counter + 1
END

每个都INSERT将插入一整行- 您提供的值将插入到您指定的列中,但其他列将全部保留NULL

于 2018-05-21T10:03:13.000 回答
0

您可以在循环中使用单个插入语句插入具有 3 个不同列值的每一行:

WHILE @counter <= @maxCounter
BEGIN
    INSERT INTO #Info (DLoc,DCode,Dobs)
    VALUES (
          'Location_' + CAST(@counter AS VARCHAR(16))
        , 'Code_' + CAST(@counter AS VARCHAR(16))
        , 'Observation_' + CAST(@counter AS VARCHAR(16))
        );
    SET @counter = @counter + 1;
END;

INSERT...SELECT或者,您可以使用计数表作为源在单个语句中一次插入所有行。如果您没有计数表,则可以使用 CTE 生成一组数字。下面的示例使用可以根据需要扩展的CTEwith 。ROW_NUMBER()

WITH 
     t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
    ,t1k AS (SELECT 0 AS n FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
    ,t1m AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num FROM t1k AS a CROSS JOIN t1k AS b CROSS JOIN t1k AS c)
INSERT INTO #Info (DLoc,DCode,Dobs)
SELECT
          'Location_' + CAST(num AS VARCHAR(16))
        , 'Code_' + CAST(num AS VARCHAR(16))
        , 'Observation_' + CAST(num AS VARCHAR(16))
FROM t1m
WHERE num <= @maxCounter;

在 SQL Server 中,基于集合的操作通常比过程循环构造好几个数量级。

于 2018-05-21T10:05:55.793 回答