从表中复制一行,然后在SQL-SERVER

时间:2019-01-11 14:12:44

标签: sql sql-server tsql

此查询存在问题,我想复制一些列并将新值添加到同一表中,但似乎无法正常工作。我不知道怎么了

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列

3 个答案:

答案 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