OUTPUT INSERTED语句后,表变量字段为空?

时间:2014-08-12 13:37:32

标签: sql-server-2008 tsql

在下面的存储过程中,在运行第一个insert语句之后,变量@newId为null,因此当它到达IF (@copyExtra = 1)部分时,@newId为空并且失败,所以我想知道为什么@newId为空。我也试过SCOPE_IDENTITY() and @@IDENTITY

ALTER PROCEDURE Copy 
    @copyFromId uniqueidentifier,
    @copyToId uniqueidentifier,
    @copyExtra bit

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @newId uniqueidentifier

    DECLARE @NID table 
    ( 
        ID uniqueidentifier primary key 
    )

    IF (@copyToId IS NOT NULL)
    BEGIN

    INSERT INTO Table1 (
            DOB,
            MaidenName,
        )
        OUTPUT INSERTED.CID INTO @NID
        SELECT MaidenName,@copyToId,
        FROM 
            Table1 
        WHERE 
            ID = @copyToId AND CID = @copyFromId

        -- Get ID of new record
        SELECT @newId = ID FROM @NID


        IF (@copyExtra = 1)
        BEGIN

            DECLARE @id uniqueidentifier

            INSERT INTO TableExtra(
            CID,
            FirstName,
            LastName

        )
        SELECT
            @newId,FirstName,LastName
        FROM 
            TableExtra 
        WHERE 
            CID = @copyFromId
        END

    END
END

1 个答案:

答案 0 :(得分:3)

如果没有表结构和示例数据,就无法分辨这里到底发生了什么。有些原因@NewId可能为null,有些事情要测试:

  • Table1中的SELECT语句可能没有返回数据,如果where子句没有返回ID = @copyToIdCID = @copyFromId的行,它将会返回。有这样的数据吗?当你只运行该语句的SELECT部分​​时会得到什么?

  • 据推测,表格中有一个列CID我们uniqueidentifier配置了默认值,以便在每个插入上生成一个GUID。如果没有,并且如果可以为空,那么你将得到一个空值。在INSERT语句后向代码中输入SELECT * from @NID,查看该表中的内容

  • 可能INSERT语句返回了乘数行,并且出现了一些奇怪的东西?不能说,我们不知道所涉及的表格或数据。

  • INSERT语句本身显示格式错误。您正在插入列(DOB,MaidenName),您从列(MaidenName,@ copyToId)插入,SQL将按顺序匹配它们并尝试将MaidenName填充到DOB中并将@CopyToId填充到MaidenName中。根据数据类型和隐式转换,我不得不认为会生成错误或垃圾数据;对于前者,你会看到一个错误,而后者,等待解决上述几点,你仍然应该得到一个新的行。