当前位置: 首页 > 面试题库 >

SQL中的全局变量

穆睿才
2023-03-14
问题内容

假设我想创建一个sql脚本并执行以下操作:

DECLARE @SomeVariable int
SET @SomeVariable = 'VALUE'
  FROM someTable
--do stuff with @SomeVariable
GO

CREATE PROCEDURE myProcedure
(
  @MyParameter
)
AS
SET NOCOUNT ON

--Do something
--Do something using @SomeVariable
SET NOCOUNT OFF
RETURN 0
GO

我不能,因为@SomeVariable与他所属的批次一起死亡,而myProcedure需要它自己的批次。显然,我可以创建一个#temp表并在其中填充所需的任何值,但随后我必须从中选择-
添加代码,尽管琐碎,但会损害可读性,并且当我需要的只是一个全局变量时似乎很愚蠢。有没有更好的办法?

要痛苦地清除。我知道SQL
Server具有称为“表”的“全局变量”-我在上一段中提到使用#table是一种可能的解决方案,就像使用实际的永久表一样。我在这里寻找的可能更多是我可以在给定脚本中的任何地方使用的全局常量,而不是全局变量-
因此我们都可以停止为全局变量的弊端而烦恼。


问题答案:

尚不清楚为什么在两个批次的示例集中,存储的proc依赖于您的全局变量。我看到了两种主要可能性:SP在创建时就依赖于全局(即代码生成-
情况1),或者SP在运行时对全局具有依赖性(即您必须在参数化-情况2之间进行选择),或者自我配置-Case3)。

对于运行时依赖关系,是从SP外部的某个位置获取并作为参数传递还是直接在SP内部传递,这是基本的设计决策。选择何时传递数据作为参数以及何时从表中提取数据并不是一门科学,而是全部取决于系统中所有实际的使用情况。

情况1-代码生成:

DECLARE @SomeVariable int 
SET @SomeVariable = 'VALUE' 
  FROM someTable 
--do stuff with @SomeVariable 
GO

DECLARE @sp as varchar(MAX)

SET @sp = '
CREATE PROCEDURE myProcedure -- I would actually name this myProcedure_ + CONVERT(varchar, @SomeVariable), since each proc generated might function differently
( 
  @MyParameter 
) 
AS 
SET NOCOUNT ON 
DECLARE @SomeVariable AS int -- This is going to be an initialized local copy of the global at time of SP creation
SET @SomeVariable = ' + CONVERT(varchar, @SomeVariable) + '

--Do something 
--Do something using @SomeVariable 
SET NOCOUNT OFF 
RETURN 0 
'
EXEC(@sp) -- create the procedure dynamically

Executing the producedure normally as EXEC myProcedure or EXEC myProcedure_1, etc.

情况2-参数化:

DECLARE @SomeVariable int 
SET @SomeVariable = 'VALUE' 
  FROM someTable 
--do stuff with @SomeVariable 
GO

CREATE PROCEDURE myProcedure 
( 
  @MyParameter 
  ,@SomeVariable int
) 
AS 
SET NOCOUNT ON

--Do something 
--Do something using @SomeVariable 
SET NOCOUNT OFF 
RETURN 0 
GO

现在,无论何时myProcedure调用,都必须始终将其传递给参数@SomeVariable。当您定期调用具有不同参数化的同一SP时,建议使用此方法

情况3-配置:

DECLARE @SomeVariable int 
SET @SomeVariable = 'VALUE' 
  FROM someTable 
--do stuff with @SomeVariable 
GO

CREATE PROCEDURE myProcedure 
( 
  @MyParameter 
) 
AS 
SET NOCOUNT ON

--Do something 
DECLARE @SomeVariable int 
SET @SomeVariable = 'VALUE' 
  FROM someTable

SET NOCOUNT OFF 
RETURN 0 
GO

现在,无论何时执行EXEC
myProcedure,都需要确保已在表中设置了配置。对于缓慢更改的配置案例,建议使用此方案。在这种情况下,您可以将@SomeVariable初始化包装在标量值的UDF中,这样,每次在不同的SP中使用相同的配置时,它们都将通过同一UDF进行调用,从而使您可以自由更改配置表约定(不必还是不向您的用户授予对表的SELECT权限,对吗?)并且,如果UDF需要根据用户或类似用户开始更改,那么您现在有了一个控制点,该控制点强制执行一致性,权限和接口调用约定:

DECLARE @SomeVariable int 
SET @SomeVariable = dbo.udf_Global(username, session, etc.)
--do stuff with @SomeVariable 
GO

CREATE PROCEDURE myProcedure 
( 
  @MyParameter 
) 
AS 
SET NOCOUNT ON

--Do something 
DECLARE @SomeVariable int 
SET @SomeVariable = dbo.udf_Global(username, session, etc.)

SET NOCOUNT OFF 
RETURN 0 
GO


 类似资料:
  • 问题内容: 我在VBA中有以下代码: newvalue和tempvalue都是全局变量,并且已经被设置为值。语法上,这有意义吗?还是我缺少引号? 问题答案: 试试这个: 如果是 数字 : If是 字符串 (如果/不包含单引号): If是 字符串 (如果/包含单引号,如): 如果是 日期 : 感谢@HansUp在注释中指出, MID是函数的名称,因此在SQL语句中将该字段名称放在方括号或别名中会更安

  • 本文向大家介绍Lua中的全局变量、非全局变量总结,包括了Lua中的全局变量、非全局变量总结的使用技巧和注意事项,需要的朋友参考一下 前言 Lua将其所有的全局变量保存在一个常规的table中,这个table称为“环境”。这种组织结构的优点在于,其一,不需要再为全局变量创造一种新的数据结构,因此简化了Lua的内部实现;另一个优点是,可以像其他table一样操作这个table。为了便于实施这种操作,L

  • 问题内容: 如何在Java中定义全局变量? 问题答案: 要定义全局变量,你可以使用静态关键字 现在你可以通过调用从任何地方访问a和b

  • 我想使用大小为2的FIFO队列来存储数据流的元素。在任何情况下,我都需要流中的前一个元素,而不是当前元素。为此,我在流代码之外创建了一个队列,并将当前元素加入队列。当我的队列有两个元素时,我将其出列并使用第一个元素。 我面临的问题是,我不能加入队列,因为它是在我的流代码之外声明的。我想这是因为流使用多个JVM,我的队列将在一个JVM中声明。 下面是一个示例代码: 在这里,没有任何东西进入队列,队列

  • 问题内容: 我在控制器的作用域上初始化变量时遇到问题。然后,当用户登录时,它将在另一个控制器中进行更改。此变量用于控制诸如导航栏之类的操作,并根据用户的类型来限制对网站某些部分的访问,因此保持其值很重要。它的问题是初始化它的控制器,再次通过某种方式被调用,然后将变量重置为其初始值。 我认为这不是声明和初始化全局变量的正确方法,也不是真正的全局变量,所以我的问题是什么是正确的方法,并且在使用当前版本

  • 我尝试创建一个Dart单页应用程序。 我已经创建了第一个自定义元素(),它包含整个应用程序。它有一个容器,用于呈现视图。和一个侧导航,它将包含用户信息,并在用户登录时更新。 我想在视图之间共享信息。如何在