创建表格并插入行(如果不存在),否则只需插入



我能够创建表,撕碎JSON和添加数据,如果它不存在于SQL Server:

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'

但是,当我尝试用如下所示的插入行代码替换print语句时,它失败了

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

在这里,您必须在SELECT中定义与INSERT期望的一样多的项——这些项可以是表(或视图)中的列,也可以是字面量或变量。同样:显式地提供要插入的列列表——见上文。

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

相关内容

  • 没有找到相关文章

最新更新