【问题标题】:Error when using INSERT INTO with SELECT将 INSERT INTO 与 SELECT 一起使用时出错
【发布时间】:2011-10-11 23:47:46
【问题描述】:

我正在尝试在 MSSQL 上编译这个存储过程:

ALTER PROCEDURE [dbo].[sp_Notice_insert]
    @type text,
    @message text
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO tbl_Notices (id, type, message)
    VALUES (NewID(), @type, @message);

    DECLARE @noticeid uniqueidentifier;
    SET @noticeid = SCOPE_IDENTITY();

    INSERT INTO tbl_NoticesInbox (userid, noticeid)
    (SELECT id, @noticeid FROM tbl_User WHERE role='Staff');

END
GO

它应该在一个表中插入一个“通知”,然后为每个“员工”用户在收件箱表中插入一个“通知”。但是在编译时出现此错误:

操作数类型冲突:数字与唯一标识符不兼容

“角色”字段是nbarchar(10),所以我也尝试将N'Staff' 作为值,但我得到了同样的错误。它没有说明哪些类型实际上是冲突的。我做错了什么?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    问题是SCOPE_IDENTITY() 返回在当前范围内输入IDENTITY 列的最后一个值,因此默认情况下返回一个数值。

    在我看来,您想创建一个 NEWID() 并使用它来插入标题和相关记录:

    DECLARE @noticeid uniqueidentifier;
    SET @noticeid = NEWID();
    
    INSERT INTO tbl_Notices (id, type, message)
    VALUES (@noticeid , @type, @message);
    
    INSERT INTO tbl_NoticesInbox (userid, noticeid)
    (SELECT id, @noticeid FROM tbl_User WHERE role='Staff');
    

    【讨论】:

    • 天啊,我是个白痴。你是绝对正确的 - 因为我正在动态生成一个新的 ID,所以我可以将它存储在一个变量中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2019-02-22
    • 2015-12-26
    • 2021-12-10
    相关资源
    最近更新 更多