2014-11-06 138 views
6

为什么以下INSERT语句不会提供任何错误?SQL Server:插入INTO语句语法

CREATE TABLE Table1(id INT,name VARCHAR(10)) 

INSERT INTO Table1(xx.id,yyyy.name) Values (1,'A') 

为什么上述声明忽略xx.yyyy.?这意味着什么?

+1

什么是XX。和yyy。应该代表? INSERT INTO(id,name)VALUES(1,'A') – mxix 2014-11-06 11:53:39

+1

正如OP指出的那样,这不会产生错误:http://www.sqlfiddle.com/#!6/057c5。 – 2014-11-06 12:12:45

回答

-1

据我所知,你使用的语法通常意味着table.column 所以换句话说,你试图插入到Table1中,但声明来自其他表的列。

你应该做这样的事情

CREATE TABLE Table1(id INT,name VARCHAR(10)) 

INSERT INTO Table1(id,name) Values (1,'A') 
+4

我认为问题不在于它应该如何,而是为什么尽管语法不正确,问题的陈述仍然有效。 – 2014-11-06 11:55:33

0

这意味着东西...

例如命名空间:

SELECT object.id, object.name FROM table object WHERE object.name = 'Foo'; 

             /\ 
              | | 
          object is the name space for the table. 

如果你还没有命名空间创建查询失败。

0

我能想到的唯一情况是数据库引擎忽略名称空间,因为在处理INSERT INTO时,查询的作用域限于表的作用域。说到UPDATE,其中多个表可以成为范围的一部分,下面的内容会失败。不知道为什么会发生这种情况,但如果我猜测,可能是所有值在最后一个时间段的左边。被忽略

如果你分析的执行计划下面的查询

CREATE TABLE Table1(id INT,name VARCHAR(10)) 

INSERT INTO Table1(Table2.dbo.id,...................name) Values (1,'A') 

AS

INSERT INTO [Table1]([id],[name]) Values(@1,@2) 
1

我检查了下面的查询也。

INSERT INTO Table11(xx.xx.xx.xx.xx.xx.xx.id,yy.yy.yy.yy.yy.yy.yy.yy.name) 
Values (1,'A') 

它也得到了工作。通常我们使用别名来进行连接。据我所知,对于插入查询在表名附近使用别名在sql中受到限制。在列名称的情况下,查询只使用最后一个点(。)旁边的字符串。

我得出结论:插入查询不关心以点号(。)分隔的列名前缀的字符串。