这是存储过程的片段。这里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表只包含一列?
答案 0 :(得分:0)
INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2) FROM t16M WHERE num <= 100000;
您认为应该正确的上述INSERT
会插入dbo.TestTable的Col1
和Col2
列。
但是要将哪些列或值 FROM t16M复制到Col1
和Col2
?
您的查询版本未指定要放入Col1
和Col2
的其他表中的任何值(硬编码 - 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
说出来并不是一个更短的方式。