Tsql T-sql连接变量以在插入while循环中使用

Tsql T-sql连接变量以在插入while循环中使用,tsql,variables,while-loop,concatenation,Tsql,Variables,While Loop,Concatenation,我正在尝试创建一个SQL语句,它允许我在创建一系列CTE或temp表时节省时间,这些CTE或temp表都是相同的,并且只在某些地方递增。我可以用VBA实现这一点,但我不知道用SQL是否可以实现这一点 我正在尝试运行以下代码 DECLARE @N as INT DECLARE @POINTS as TABLE(ID int Not Null,n varchar(3) Not Null) DECLARE @TABLENAME varchar(6) Set @INC = 1 Set @N = 5

我正在尝试创建一个SQL语句,它允许我在创建一系列CTE或temp表时节省时间,这些CTE或temp表都是相同的,并且只在某些地方递增。我可以用VBA实现这一点,但我不知道用SQL是否可以实现这一点

我正在尝试运行以下代码

DECLARE @N as INT
DECLARE @POINTS as TABLE(ID int Not Null,n varchar(3) Not Null)
DECLARE @TABLENAME varchar(6)

Set @INC = 1
Set @N = 5

--WHILE @INC <= @N
--BEGIN

Declare @N1 INT
Declare @N2 INT
Declare @N3 INT
Declare @N4 INT
Declare @N5 INT
SET @N1=25
SET @N2=50
SET @N3=100
SET @N4=250
SET @N5=500
--END

WHILE @INC <= @N
    BEGIN
        INSERT INTO @POINTS(ID, n) 
        VALUES (@INC, CONCAT('@N',@INC))
        SET @INC = @INC + 1
    END

Select * from @POINTS
是否可以将我为每个@Nx变量设置的值插入n列,而不是连接的字符值?如果是,怎么做?我还没有找到任何关于某人尝试这样做的结果


我可以通过使用外部表格来解决这个问题,但我想知道这是否可行

如果只有少量的值,那么最好编写一条insert语句,将所有5行插入表中:

INSERT INTO @POINTS(ID, n) VALUES 
(1, '5'), 
(2, '25'), 
(3, '50'),
(4, '100'),
(5, '250'),
(6, '500');
如果您有太多的值要这样写,您可以使用cte生成一个内联理货表,并使用
insert…从该理货表中选择

DECLARE @Points as TABLE
(
    ID int Not Null,
    n varchar(3) Not Null
);

WITH E10(N) AS
(
    SELECT 1 
    FROM (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9))V(N)
), Tally(N) AS
(
    -- Since all the numbers are multiples of 5, 
    -- there's no point of populating the tally
    -- with numbers that aren't multiples of 5....
    SELECT ROW_NUMBER() OVER(ORDER BY @@SPID) * 5
    FROM E10 As Ten
    CROSS JOIN E10 As Hundred
    --Need more? Add more cross joins 
    -- each will multiply the number of rows by 10:
    --CROSS JOIN E10 As Thousand
    --CROSS JOIN E10 As [Ten Thousand] -- and so on    
)

INSERT INTO @Points(ID, n) 
SELECT ROW_NUMBER() OVER(ORDER BY N), CAST(N as varchar(3))
FROM Tally
WHERE N IN(5, 25, 50, 100, 250, 500);

SELECT *
FROM @Points;
结果:

ID  n
1   5
2   25
3   50
4   100
5   250
6   500

当然,如果你已经有了理货台,你不需要cte…

这整件事闻起来像是个错误。SQL不是一种编程语言,在这个世界上,使用循环几乎从来都不是正确的解决方案。我不知道你为什么想要“一系列CTE或temp表,它们都是相同的,只在某些地方增加”,但我可以保证,这是解决你可能面临的任何问题的错误方法。这对我来说很像一个循环,我正在考虑使用循环,因为我想在需要修改时减少返工时间。我已经将其作为一个传统的SQL语句编写,可以正常工作。问题是,当我想要进行更改时,我必须接触五个不同的表定义,它们除了命名之外在各个方面都是相同的。我实际上是在使用记事本++并使用替换工具对代码进行更改,然后复制/粘贴“我必须触摸五个不同的表定义,除了命名以外,它们在各个方面都是相同的。”这就表明数据库设计很差(临时或简单的Id到名称转换表除外)。如果您有多个表来描述单个业务实体-这是您的数据库设计中的一个问题。数据库设计没有问题,我从现有数据库中提取不同数量的测试值,以便查看功能统计数据随时间的变化情况。唯一改变的是每次迭代的N计数。
ID  n
1   5
2   25
3   50
4   100
5   250
6   500