Tsql T-sql连接变量以在插入while循环中使用
我正在尝试创建一个SQL语句,它允许我在创建一系列CTE或temp表时节省时间,这些CTE或temp表都是相同的,并且只在某些地方递增。我可以用VBA实现这一点,但我不知道用SQL是否可以实现这一点 我正在尝试运行以下代码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
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