-1

我不是 TSQL 的专业人士,我有这个功能:

for (i=1;i<=30;i++) {
    for (j=1;j<=10;j++){
        insert into NAMES values ("","","Name"+i+" - fn"+j", "Name"+i+" - fn"+j", "Numeric", "R",0,"N",0,"00");
     }
}

我想将其转换为 SQL 函数,以便一次插入所有这 300 条记录 (30x10 )。

4

2 回答 2

5

你不能INSERT对一个函数做一个。如果我理解正确,这就是你想要的:

DECLARE @I INT, @J INT
SET @I = 1
SET @J = 1

WHILE @I <= 30
BEGIN
    WHILE @J <= 10
    BEGIN
        INSERT INTO NAMES
        SELECT  '',
                '',
                'Name'+CAST(@I AS VARCHAR(2))+' - fn'+CAST(@J AS VARCHAR(2)),
                'Name'+CAST(@I AS VARCHAR(2))+' - fn'+CAST(@J AS VARCHAR(2)),
                'Numeric',
                'R',
                0,
                'N',
                0,
                '00'

        SET @J = @J + 1
    END
    SET @J = 1
    SET @I = @I + 1
END
于 2013-05-13T21:53:47.483 回答
3

您还可以使用数字表来避免循环。

WITH
  L0       AS(SELECT 1 AS c UNION ALL SELECT 1),
  L1       AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
  L2       AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
  L3       AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
  L4       AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
  Nums     AS(SELECT  TOP(300) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L4),
  IJ(i,j)  AS(SELECT CAST(1 + n%30 AS VARCHAR(2)), CAST(1 + n%10 AS VARCHAR(2))  FROM Nums)
 INSERT INTO NAMES  
SELECT '',
       '',
       'Name' + i + ' - fn' + j, 
       'Name' + i + ' - fn' + j,
       'Numeric', 
       'R',
       0,
       'N',
       0,
       '00'
 FROM IJ;
于 2013-05-13T21:58:54.513 回答