Estou criando um procedimento armazenado para adicionar em uma tabela os dados de um json. A tabela tem um ID
definido como uniqueidentifier
e um CreatedAt
definido como datetime
.
Se eu tentar executar este script sem ID
and\or CreatedAt
, recebo este erro
O nome da coluna ou o número de valores fornecidos não corresponde à definição da tabela.
Um exemplo do script é o seguinte:
INSERT INTO [RequestsDetails]
SELECT *
FROM OPENJSON(@json)
WITH (
RequestId uniqueidentifier '$.RequestId',
QuoteId uniqueidentifier '$.QuoteId',
SiteId int '$.SiteId',
SumBuilding money '$.SumBuilding'
)
Se eu adicionar a linha usando NEWID()
for the ID
e GETDATE()
for the CreatedAt
, recebo o erro
Sintaxe incorreta próxima
NEWID
e este é um exemplo do script
INSERT INTO [RequestsDetails]
SELECT *
FROM OPENJSON(@json)
WITH (
Id uniqueidentifier NEWID(),
RequestId uniqueidentifier '$.RequestId',
QuoteId uniqueidentifier '$.QuoteId',
SiteId int '$.SiteId',
SumBuilding money '$.SumBuilding',
CreatedAt datetime GETDATE()
)
Como posso adicionar esses valores que não estão presentes no json?
Atualizar
Se no procedimento armazenado eu tiver um parâmetro, como posso usá-lo no INSERT
? Por exemplo
@RequestId uniqueidentifier
INSERT INTO [Sace].[RequestsDetails] (
RequestId
-- omitted all the fields
)
SELECT *
FROM OPENJSON(@json)
WITH (
RequestId uniqueidentifier @RequestId
-- omitted all the fields
)
O problema não tem nada a ver com
OPENJSON
; de onde vêm os dados, sejaOPENJSON
uma tabela, umaVALUES
cláusula, etc, etc, o erro ocorrerá. O problema é a suaINSERT INTO
cláusula; você omitiu as colunas que deseja,INSERT
o que significa que está declarando que deseja inserirINSERT
um valor em cada coluna dessa tabela (com a omissão deIDENTITY
colunas).A solução, portanto, é consertar sua
INSERT INTO
cláusula; seja explícito nas colunas que desejaINSERT
, o que você deve sempre fazer:Você pode informar ao SQL Server
INSERT
o valor padrão, com aDEFAULT
palavra-chave, no entanto, que só é suportada com umaVALUES
construção de tabela, não com um arquivoINSERT INTO... SELECT ...
.