创建 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
查询 - 选择两个中的一个 - 坚持下去。
我可以创建 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
查询 - 选择两个中的一个 - 坚持下去。