创建 table 并在不存在的情况下插入行,否则只插入

Create table and insert rows if doesn't exist, else just insert

我可以创建 table、粉碎 JSON 并添加数据(如果 SQL 服务器中不存在):

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))

我做错了什么?

INSERT 命令有两种形式:

(1) 要么你有所有可用的值,作为文字或 SQL 服务器变量 - 在这种情况下,你可以使用 INSERT .. VALUES()方法:

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

注意:我建议 始终 明确指定要插入数据的列列表 - 这样,如果突然 table 有一个额外的列,或者如果您的 table 有一个 IDENTITY 或计算列。是的 - 它的工作有点多 - 一次 - 但是你的 INSERT 声明尽可能可靠,你不必经常 fiddle 如果你的 table 改变了。

(2) 如果您 没有 将所有值作为文字 and/or 变量,但您想要要依赖另一个 table、多个 table 或视图来提供值,则可以使用 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 预期一样多的项目 - 这些可以是 table(s)(或视图(s)中的列)), 或者那些可以是文字或变量。再次:明确提供要插入的列列表 - 见上文。

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