【问题标题】:Create table and insert rows if doesn't exist, else just insert如果不存在则创建表并插入行,否则只需插入
【发布时间】:2021-03-04 05:26:53
【问题描述】:

如果 SQL Server 中不存在,我可以创建表、分解 JSON 并添加数据:

DECLARE @json nvarchar(max);

SET @json = N'[{"IplayerName": "Pilipiliz",
                 "Sname": "kikombe",
                 "WeightLBs":"60.236"
               }]'

IF NOT EXISTS (SELECT * FROM sys.objects WHERE OBJECT_ID = object_id('Iplayerds')) 
BEGIN
    SELECT
        [IplayerName],
        [Sname],
        [WeightLBs]
    INTO
        Iplayerds
    FROM
        OPENJSON(@json) 
        WITH (IplayerName NVARCHAR(200),
              Sname NVARCHAR(20),
              WeightLBs DECIMAL(10,4)
             )
END
ELSE
    PRINT 'exists'

但是,当我尝试用下面显示的插入行代码替换打印语句时,它失败了

INSERT INTO Iplayerds (IplayerName, Sname, WeightLBs)
VALUES ([IplayerName], [Sname], [WeightLBs]
FROM OPENJSON(@json))

我做错了什么?

【问题讨论】:

  • @Dale K Msg 156, Level 15, State 1, Line 38 Incorrect syntax near the keyword 'SELECT'. Msg 102, Level 15, State 1, Line 40 Incorrect syntax near ')'. 会在出错的地方添加图片

标签: json sql-server tsql sql-insert insert-update


【解决方案1】:

INSERT 命令有两种形式:

(1) 要么您拥有所有可用的值,如文字或 SQL Server 变量 - 在这种情况下,您可以使用 INSERT .. VALUES() 方法:

INSERT INTO dbo.Iplayerds (IplayerName, Sname, WeightLBs)
VALUES (@IplayerName, @Sname, @WeightLBs)

注意:我建议总是明确指定要插入数据的列列表 - 这样,如果您的表突然有一个额外的列,或者如果您的表有一个 IDENTITY 或计算列。是的 - 需要做更多的工作 - 一次 - 但是你的 INSERT 声明尽可能可靠,如果你的表发生变化,你就不必经常摆弄它。

(2) 如果您将所有值都作为文字和/或变量,但是您想依赖另一个表、多个表或视图,提供值,那么您可以使用INSERT ... SELECT ... 方法:

INSERT INTO dbo.Iplayerds (IplayerName, Sname, WeightLBs)
   SELECT
       [IplayerName], [Sname], [WeightLBs]
   FROM 
       OPENJSON(@json) WITH (IplayerName NVARCHAR(200),
                             Sname NVARCHAR(20),
                             WeightLBs DECIMAL(10,4)
                            )           

在这里,您必须在 SELECT 中定义与 INSERT 期望的一样多的项目 - 这些可以是表(或视图)中的列,也可以是文字或变量.再次:明确提供要插入的列列表 - 见上文。

你可以使用一个或另一个 - 但你不能混合使用这两个 - 你不能使用 VALUES(...) 然后在中间有一个 SELECT 查询你的价值观列表 - 选择两者之一 - 坚持下去。

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2019-05-31
    相关资源
    最近更新 更多