Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中本地包含代码块_Sql_Sql Server - Fatal编程技术网

在SQL中本地包含代码块

在SQL中本地包含代码块,sql,sql-server,Sql,Sql Server,在Java中,可以对方法中的局部作用域变量执行以下操作: public void blah() { { int a = 1; int b = 2; } { int a = 3; int b = 4; } } 我甚至不知道这项技术的名称,我只需要使用一两次。在我目前的情况下,这可能真的在这个SQL项目中派上了用场 这在SQL中可能吗 我正在使用MS SQL Server。。。 要提供更多情况,请执行以

在Java中,可以对方法中的局部作用域变量执行以下操作:

public void blah() {
    {
        int a = 1;
        int b = 2;
    }
    {
        int a = 3;
        int b = 4;
    }
}
我甚至不知道这项技术的名称,我只需要使用一两次。在我目前的情况下,这可能真的在这个SQL项目中派上了用场

这在SQL中可能吗

我正在使用MS SQL Server。。。 要提供更多情况,请执行以下操作:

我们有几个存储为文件的sql脚本,可以帮助在数据库上执行各种操作。这些脚本相当大,设计为独立运行。有时,我们需要一起运行几个脚本,并在单个文件中交付


由于大多数脚本都有公共变量,所以在将这些脚本连接在一起时会遇到冲突。当然,将所有变量声明移到文件开头很容易,但目标是使此过程自动化。

在MySQL中,变量声明必须位于子例程/存储过程的开头,类似于C函数的变量必须是。

尝试编译您在类helo标题中包装的Java代码示例会产生:

$ javac helo.java 
helo.java:7: a is already defined in blah()
        int a = 3;
            ^
helo.java:8: b is already defined in blah()
        int b = 4;
            ^
2 errors
所以,不,在Java C中不能这样做,是的;C++,是的;爪哇,不是


SQL本身没有词法范围,尽管嵌入在关系数据库中的一些存储过程方言肯定有可能,但很难帮助w/o了解确切的方言。在SQL中,可以用tablename限定其他同名字段。前缀。

在SQL Server中,不能在块中进行作用域。只要在设置之前声明就可以了。 声明也不必位于批处理或代码的开头

BEGIN
    DECLARE @a int
END
BEGIN
    SET @a = 1
END

IIRC,同样适用于Sybase。

SQL是一种声明性语言,即侧重于“what”而不是“how”。因此,其定义ansi不包含过程和块

大多数供应商的实现通过嵌入自己的过程语言来填补这一空白——微软的是TSQL,Oracle的是PL/SQL等。Mysql和SQLlite等不确定——甚至他们也没有与Java进行精确的功能匹配——没有匿名代码块

每个SQL操作在一个集合上工作,并返回一个集合

因此,mytable是一个集合,select from mytable是一个集合,select from select from mytable是一个集合

因此不可能深入到较低的粒度级别,可能列或伪列是“变量”


Oracle定义了一个select from dual操作,以保证“循环”为1,即select语句只返回1行

您使用的是什么RDBMS?神谕MySQL?Postgresql?如果你有一些SQL需要改进,或者只是一个类似SQL的伪代码,那可能是一个更好的例子。谢谢,我添加了更多的信息。我想他可能只是给出了一个坏例子是的,坏例子。虽然,几天前我使用了这个方法,而且效果很好,但也许我在块中使用了唯一的变量名。嗯……问题是,在Java中不能局部地限定块内同名变量的范围,尽管在其他语言中也可以,在SQL中也不能。尽管某些过程方言可能不同,OP需要指定他关心的是哪一种。java故意禁止这个,因为它的设计者认为它是坏的实践,即使它在C和C++中是常见的,我在这个特定的点上同意java的设计者,fWI.C完全允许一个函数内的{}块,有自己的变量声明——块的变量有块的生存期,可能会在Java中隐藏外部块的变量,后者是禁止的,因此OP的代码实际上不会在Java中编译。