SQL Server:为什么选择然后在此查询中插入?

时间:2015-03-10 15:05:30

标签: sql-server

这是存储过程的片段。这里t16M是一个有1600万行的Tally表。

INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2)
SELECT REPLICATE(N'X', 4000), REPLICATE(CAST('X' AS nvarchar(MAX)), 10000)
FROM t16M
WHERE num <= 100000;

据我所知,它将值'X ....'插入到TestTable的两列中,行数为100000行。我不明白为什么不能只是:

INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2) FROM t16M WHERE num <= 100000;

?因为Tally表只包含一列?

2 个答案:

答案 0 :(得分:0)

INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2) FROM t16M WHERE num <= 100000;

您认为应该正确的上述INSERT会插入dbo.TestTable的Col1Col2列。

但是要将哪些列或值 FROM t16M复制到Col1Col2

您的查询版本未指定要放入Col1Col2的其他表中的任何值(硬编码 - REPLICATE)或选定(列)。

如果您的TestTable尚未创建,那么您可能需要查看SELECT INTO

SELECT REPLICATE(N'X', 4000) AS Col1
    ,REPLICATE(CAST('X' AS NVARCHAR(MAX)), 10000) AS Col2
INTO dbo.TestTable
WITH (TABLOCKX)
FROM t16M
WHERE num <= 100000

答案 1 :(得分:0)

没有&#34;选择然后插入&#34;在您的查询中。查询插入select,plain和simple的结果。 MS SQL中没有insert from语法 - 您的&#34;替代&#34;查询没有编译:)

原始查询的select部分将要传递的值投射到Col1的{​​{1}}和Col2。所以查询实际上并没有比

更复杂的说法
  

将100000行(ALotOfXXX,EvenMoreXXX)插入dbo.TestTable

说出来并不是一个更短的方式。