可以插入VALUES中没有行吗?

时间:2015-03-13 14:40:04

标签: sql-server tsql

我知道这个问题可能有点深奥,但无论如何都可以用INSERT语句创建一个没有值的VALUES语句吗?

INSERT myTable
(col1, col2)
VALUES
<no values>

我正在以编程方式生成INSERT语句,我可以通过IF检查来解决此问题,但不会生成INSERT,但我很好奇这个VALUES语句可以被认为是一个集合。套可能是空的......

文档中没有提到有关空集的内容: Table Value Constructor

6 个答案:

答案 0 :(得分:3)

没有简单的语法解决方案,但您可以通过使行生成器更复杂来解决此问题。

您可以重写生成行的部分,用一组

替换VALUES构造函数
SELECT values
UNION ALL
SELECT values
UNION ALL
...

包括这种强制性选择:

SELECT NULL, NULL, ... WHERE 1 <> 1

在开始或结束时。该强制项将不会产生任何行,如果它恰好是唯一的元素,那么整个联合将不会产生任何行,INSERT语句将不会插入任何行。

如果VALUES构造函数由于某种原因是可取的,您可以修改生成器以包含(NULL, NULL, ...)项并围绕构造函数包装查询:

INSERT INTO
  target_table (target_columns)
SELECT
  *
FROM
  (VALUES
    (...),
    ...
    (NULL, ...)  -- obligatory element
  ) AS v (column_names)
WHERE
  some_of_the_columns IS NOT NULL
;

其中 some_of_the_columns 应从无法生成NULL的列中选择。同样,如果(NULL, ...)行碰巧是VALUES中唯一生成的行,则生成的查询将不会插入任何内容。

答案 1 :(得分:2)

我可以想象的唯一用途就是你想通过一个大型数据流向前读取,并在记录的末尾知道是否有值要插入。您可以重写“插入值”&#39;插入选择&#39;并在最后添加一个条件,以防止插入。

insert into myTable(col1, col2)
select null, null
where 1 = 2

答案 2 :(得分:1)

Set theory识别空集但插入值不

偶然可能的选择:
插入空值并使插入触发器使插入件无效 插入空值并有一个排除它们的视图

答案 3 :(得分:0)

简而言之,除了使用伪代码之外,您的代码很好。这应该是它的样子:

INSERT into myTable
(col1, col2)
VALUES
(null, null)

只要您的列设置为接受NULL,这将完全正常 您可能需要考虑在其中获取自动增量ID字段,以便稍后识别这些新行。

答案 4 :(得分:0)

可以通过select语句生成插入。

INSERT INTO myTable (col1, col2)
SELECT FROM otherTable WHERE condition

如果select返回no row,则不会插入任何记录,也不会抛出异常。顺便说一句。在更大的记录计数上,这比创建单行插入语句要快得多。

答案 5 :(得分:-2)

您可以使用默认数据填充列。对于int可能为0,对于文本可能为空字符串,依此类推。否则,您可以使列可以为空并用空值填充它们。这取决于你定义为空的内容。