在下面的存储过程中,在运行第一个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
答案 0 :(得分:3)
如果没有表结构和示例数据,就无法分辨这里到底发生了什么。有些原因@NewId可能为null,有些事情要测试:
Table1中的SELECT语句可能没有返回数据,如果where
子句没有返回ID = @copyToId
和CID = @copyFromId
的行,它将会返回。有这样的数据吗?当你只运行该语句的SELECT部分时会得到什么?
据推测,表格中有一个列CID我们uniqueidentifier配置了默认值,以便在每个插入上生成一个GUID。如果没有,并且如果可以为空,那么你将得到一个空值。在INSERT语句后向代码中输入SELECT * from @NID
,查看该表中的内容
可能INSERT语句返回了乘数行,并且出现了一些奇怪的东西?不能说,我们不知道所涉及的表格或数据。
INSERT语句本身显示格式错误。您正在插入列(DOB,MaidenName),您从列(MaidenName,@ copyToId)插入,SQL将按顺序匹配它们并尝试将MaidenName填充到DOB中并将@CopyToId填充到MaidenName中。根据数据类型和隐式转换,我不得不认为会生成错误或垃圾数据;对于前者,你会看到一个错误,而后者,等待解决上述几点,你仍然应该得到一个新的行。