如何在 T SQL 中创建 SQL 变量 byRef(刷新其值)?
How to create SQL Variable byRef (Refreshing its value) in T SQL?
我想知道我是否可以在 T-SQL 中创建一个变量,它会在脚本流中自行刷新。
我想创建一个引用其他 2 个变量的总和的变量。
例如:
DECLARE @Number1 INT
DECLARE @Number2 INT
DECLARE @Total INT
SET @Number1 = 5
SET @Number2 = 10
SET @Total = @Number1 + @Number2
SELECT @Total
这将显示 15。
但是,如果我在脚本的后面几行中设置:
SET @Number1 = 15
SET @Number2 = 25
SELECT @Total
还是会显示15。我知道在赋值的时候,它得到了@Number1 + @Number2 的值。
有什么方法可以 update/refresh @Total 变量的值而不用做:
SET @Total = @Number1 + @Number2
要刷新它的值?
我正在寻找,一旦@Number1 或@Number2 的值发生变化(或两者都发生变化),@Total 也会自动重新计算。
我环顾四周,但找不到任何相关信息。也许很难在 google 上为我正在寻找的内容制作 "search term"。
谢谢。
您不能在 TSQL 变量上创建触发器(或事件)。在 table 中,有些触发器的工作方式有点像您要求的与列和/或行有关的触发器。
不,没有办法用变量来做到这一点。
2 个备选方案,这可能无济于事,但会告诉您尝试执行您的要求是多么笨拙:
您可以使用 table 中的计算列来完成此操作,您可以将所有三个变量替换为 table 中的列,而不是设置和获取变量,您将插入和 select 从 table 或
您可以使用 UDF 来实现,每次您想要引用 Total 的值时,您将调用 fnTotal(Number1, Number2)。
您不能将其作为单个变量。但是如果你真的想要这个,你可以使用一个带有计算列的 table 变量:
DECLARE @V TABLE(Number1 INT, Number2 INT, Total AS Number1 + Number2);
INSERT @V (Number1, Number2) VALUES (5, 10);
SELECT Total FROM @V; -- 15
UPDATE @V SET Number1 = 15, Number2 = 25;
SELECT Total FROM @V; -- 40
这很可爱,但我绝对不建议在生产系统中这样做。为此使用 table 而不是单独的变量是非常低效的 - table 变量在 tempdb 中使用 I/O,虽然其中大部分都经过优化并且实际上没有接触磁盘,但I/O 仅仅因为您不想将两个数字相加就很沉重,尤其是当您开始到处使用这种技术时。
如果您不反对重做加法,您仍然可以通过使用多重赋值来节省输入时间:
DECLARE @Number1 INT, @Number2 INT, @Total INT;
SELECT @Number1 = 5, @Number2 = 10, @Total = @Number1 + @Number2;
SELECT @total -- 15
SELECT @Number1 = 15, @Number2 = 25, @Total = @Number1 + @Number2;
SELECT @total -- 40
我想知道我是否可以在 T-SQL 中创建一个变量,它会在脚本流中自行刷新。
我想创建一个引用其他 2 个变量的总和的变量。
例如:
DECLARE @Number1 INT
DECLARE @Number2 INT
DECLARE @Total INT
SET @Number1 = 5
SET @Number2 = 10
SET @Total = @Number1 + @Number2
SELECT @Total
这将显示 15。
但是,如果我在脚本的后面几行中设置:
SET @Number1 = 15
SET @Number2 = 25
SELECT @Total
还是会显示15。我知道在赋值的时候,它得到了@Number1 + @Number2 的值。
有什么方法可以 update/refresh @Total 变量的值而不用做:
SET @Total = @Number1 + @Number2
要刷新它的值?
我正在寻找,一旦@Number1 或@Number2 的值发生变化(或两者都发生变化),@Total 也会自动重新计算。
我环顾四周,但找不到任何相关信息。也许很难在 google 上为我正在寻找的内容制作 "search term"。
谢谢。
您不能在 TSQL 变量上创建触发器(或事件)。在 table 中,有些触发器的工作方式有点像您要求的与列和/或行有关的触发器。
不,没有办法用变量来做到这一点。
2 个备选方案,这可能无济于事,但会告诉您尝试执行您的要求是多么笨拙:
您可以使用 table 中的计算列来完成此操作,您可以将所有三个变量替换为 table 中的列,而不是设置和获取变量,您将插入和 select 从 table 或
您可以使用 UDF 来实现,每次您想要引用 Total 的值时,您将调用 fnTotal(Number1, Number2)。
您不能将其作为单个变量。但是如果你真的想要这个,你可以使用一个带有计算列的 table 变量:
DECLARE @V TABLE(Number1 INT, Number2 INT, Total AS Number1 + Number2);
INSERT @V (Number1, Number2) VALUES (5, 10);
SELECT Total FROM @V; -- 15
UPDATE @V SET Number1 = 15, Number2 = 25;
SELECT Total FROM @V; -- 40
这很可爱,但我绝对不建议在生产系统中这样做。为此使用 table 而不是单独的变量是非常低效的 - table 变量在 tempdb 中使用 I/O,虽然其中大部分都经过优化并且实际上没有接触磁盘,但I/O 仅仅因为您不想将两个数字相加就很沉重,尤其是当您开始到处使用这种技术时。
如果您不反对重做加法,您仍然可以通过使用多重赋值来节省输入时间:
DECLARE @Number1 INT, @Number2 INT, @Total INT;
SELECT @Number1 = 5, @Number2 = 10, @Total = @Number1 + @Number2;
SELECT @total -- 15
SELECT @Number1 = 15, @Number2 = 25, @Total = @Number1 + @Number2;
SELECT @total -- 40