T-SQL过程编程

时间:2017-10-10 02:59:35

标签: sql-server

line1   SELECT 'A'

line2   SELECT  CONCAT(a,b);

line3   SELECT 'B'

在SQL Server 2008中尝试这一点,发现由于第2行的批处理失败,将不会查询line1。如果SQL Server是程序编程,那么line1应该是'被成功查询了吗?

2 个答案:

答案 0 :(得分:2)

观察到的行为的原因是您看到编译时错误,而不是运行时错误。 Here是一些可能会对它们之间的差异有所了解的例子。

当数据库引擎遇到编译时错误时,整个批处理根本没有执行,并且您的代码包含一个批处理。这就是为什么你没有看到任何结果。但是,如果您将这些语句与go分开(在SSMS,sqlcmd或任何其他识别它的客户端),则只会跳过第二个语句。

答案 1 :(得分:0)

SELECT 'A'

在T-SQL中有效,并且它将完全显示A作为没有列标题的结果。但该查询确实 NOT 创建一个名为a的引用,该引用包含A的值。

SELECT  CONCAT(a,b);

在SQL 2008中,这不起作用,因为该功能根本不可用。另请注意,此行以分号结尾。然而,既不存在也不存在b,因为前面的唯一代码行不会创建任何持久引用。

SELECT  a + b;

在SQL 2008中,这可能有用(如果 a和b都存在且是字符串)

SELECT 'B'

在T-SQL中有效,并且它将完全显示B作为没有列标题的结果。但该查询 NOT 创建一个名为b的引用,该引用包含B的值。

简短

  1. SELECT 'A'未提供任何名称的值,以便稍后引用。
  2. 串联的顺序错误,并以;
  3. 结束
  4. SELECT 'B'不会将B的任何名称赋予以后的任何名称。
  5. T-SQL确实允许以下内容:

    DECLARE @a AS VARCHAR(10)
    DECLARE @b AS VARCHAR(10)
    
    SET @a = 'A'
    SET @B = 'B'
    
    SELECT @a + @b
    ;
    

    另一种方法:

    select a + b 
    from (select 'A' as a, 'B' as b) as derived
    

    这里派生表的列被赋予a和b的别名,可以在外部select子句中引用它们来执行连接。