【发布时间】:2021-10-17 03:15:48
【问题描述】:
我尝试一次将 50 行从一个表插入到另一个表中,但是我无法绕过我尝试插入的表中的“非空”列。
请注意,我无法更改该列,因此它接受空值。
我有 2 张桌子(桌子 1 和桌子 2)。我将表 1 中的 2 列插入表 2(表 2 当前为空)。问题是表 2 的第三列不能有空值。
这是我目前所拥有的。
-- Checking what exists in Table 1 that doesn't exist in Table 2 before inserting
IF EXISTS (SELECT T1.Column1, T1.Column2
FROM Table_1 T1
LEFT JOIN Table_2 T2 on T1.Column1=T2.Column1
WHERE T2.Column1 IS NULL)
BEGIN
INSERT INTO Table_2 (Column1, Column2)
SELECT TOP(50) Column1, Column2
FROM Table_1
ORDER BY Column1
SELECT @@ROWCOUNT
END
IF @@ROWCOUNT < 50
(
SELECT *
FROM Table_2
)
BEGIN
UPDATE Table_2
SET Column3 = 0
END
问题是表 2 中的第 3 列在表 1 中不存在,因此我无法将表 1 中的任何内容插入到表 2 中以填充表 2 中不允许空值的列。
【问题讨论】:
-
在您的 SELECT 中为表 2 中缺少的第 3 列使用常量?
-
您必须在插入和选择中指定 Column3。除非 Column3 具有默认值,否则您无能为力。即:插入 Table_2 (Column1, Column2, Column3) SELECT top(50) Column1, Column2, 'SOMETHING' FROM Table_1
-
为什么要检查
@@ROWCOUNT的值是否小于3000,前面的查询使用TOP (50)所以它必须小于3000。 -
@Larnu 错误我已修复
-
那
IF EXISTS没有多大意义:无论如何,列列表永远不会被评估,它也可能是SELECT 1,而LEFT JOIN/IS NULL作为嵌套的NOT EXISTS更好,并且如果EXISTS为真,您将插入Table_1的整个,因此您仍然可以获得重复的行,您还需要将Table_2签入INSERT。
标签: sql sql-server