我能够创建表,撕碎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
查询-选择其中一个-坚持使用它。