line1 SELECT 'A'
line2 SELECT CONCAT(a,b);
line3 SELECT 'B'
在SQL Server 2008中尝试这一点,发现由于第2行的批处理失败,将不会查询line1
。如果SQL Server是程序编程,那么line1
应该是'被成功查询了吗?
答案 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的值。
简短
SELECT 'A'
未提供任何名称的值,以便稍后引用。SELECT 'B'
不会将B的任何名称赋予以后的任何名称。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子句中引用它们来执行连接。