如果不存在则创建表并插入行,否则插入

问题描述

如果 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],[WeightLBs]
FROM OPEnjsON(@json))

我做错了什么?

解决方法

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,WeightLBs)
   SELECT
       [IplayerName],[Sname],[WeightLBs]
   FROM 
       OPENJSON(@json) WITH (IplayerName NVARCHAR(200),Sname NVARCHAR(20),WeightLBs DECIMAL(10,4)
                            )           

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

您可以使用其中之一 - 但您不能将两者混合使用 - 您不能使用 VALUES(...) 然后进行 SELECT 查询在您的价值观列表的中间 - 从两个中选择一个 - 坚持下去。