此查询存在问题,我想复制一些列并将新值添加到同一表中,但似乎无法正常工作。我不知道怎么了
GO
IF OBJECT_ID('dbo.spInsertCopyDocumentos') IS NOT NULL
DROP PROCEDURE spInsertCopyDocumentos
GO
CREATE PROCEDURE spInsertCopyDocumentos
@IdArtigo int,
@IdNovo int
AS
BEGIN
SET NOCOUNT ON
INSERT INTO hDocumentos (IdArtigo) VALUES (@IdNovo)
SELECT TipoDocumento, NomeDocumento,Dados, Extensao, Observacoes
FROM hDocumentos
WHERE IdArtigo = @IdArtigo
END
它说TipoDocumento为空,但它具有值,并且是整数...我不确定为什么它说为空,因为如果我运行select查询,它将显示值。它也有2行,所以我可能不确定这是否仅适用于一个
编辑。
我要从其他记录ID复制文件,因此为什么我需要@IdNovo在此处将新值插入外键ID列
答案 0 :(得分:2)
您只是在寻找
IF OBJECT_ID('dbo.spInsertCopyDocumentos') IS NOT NULL
DROP PROCEDURE spInsertCopyDocumentos
GO
CREATE PROCEDURE spInsertCopyDocumentos
@IdArtigo int,
@IdNovo int
AS
BEGIN
SET NOCOUNT ON
-- You can check the params for NULL here and raise an error
INSERT INTO hDocumentos (IdArtigo)
SELECT @IdNovo
FROM hDocumentos
WHERE IdArtigo = @IdArtigo
END
如果要复制所有数据,则需要将列名称指定为
INSERT INTO hDocumentos (IdArtigo, Col1, Col2, ..)
SELECT @IdNovo, ISNULL(Col1, <DefaultValue>), ISNULL(Col2, <DefaultValue>) ...
FROM hDocumentos
WHERE IdArtigo = @IdArtigo
并使用ISNULL()
检查NULL
,并将其替换为自列NULL
起的默认值而不是IS NOT NULL
。
对于您得到的错误,因为您仅指定了(IdArtigo)
列,这意味着您将插入除NULL
列(在{{ 1}}子句。因此,您试图在IdArtigo
列中插入一个INSERT
值,原因是您没有指定要插入哪个值。
最后,您的过程应如下所示:
NULL
答案 1 :(得分:2)
我不确定hDocumentos
是什么样子,但是如果要插入@IdNovo
的{em>和行,select
会看起来像这个:
ALTER PROCEDURE spInsertCopyDocumentos
@IdArtigo int,
@IdNovo int
AS
BEGIN
SET NOCOUNT ON
INSERT INTO hDocumentos (col1, col2, col3, col4, col5, col6)
SELECT TipoDocumento, NomeDocumento,Dados, Extensao, Observacoes, @IdNovo
FROM hDocumentos
WHERE IdArtigo = @IdArtigo
END
答案 2 :(得分:1)
好的,我知道它是如何工作的。我必须像查询中的普通插入一样在插入上指定列名
INSERT INTO hDocumentos (TipoDocumento, NomeDocumento, Dados, Extensao, Observacoes,IdArtigo)
SELECT TipoDocumento, NomeDocumento, Dados, Extensao, Observacoes, @IdNovo
FROM hDocumentos
WHERE IdArtigo = @IdArtigo