【问题标题】:Incorrect Syntax When Executing Stored Proc NewId()执行存储过程 NewId() 时语法不正确
【发布时间】:2017-05-21 12:01:06
【问题描述】:

IdentityId 属于UNIQUEIDENTIFIER 类型,当我插入一条记录并将其设置为NewId() 时,我收到错误消息

不正确的语法新)

不知道我错过了什么。请指教。

执行命令:

Exec dbo.CreateUser 
         @Title = 'MR',
         @FirstName = 'John', 
         @LastName = 'Smith', 
         @IdentityId = NewId(), 
         @PhoneNumber = '01234456789', 
         @MobileNumber = '0987654321', 
         @StatesId = 2, 
         @AddressLineOne = '1 A Road',
         @AddressLineTwo = '',
         @Town = 'Some Town',
         @County = 'County',
         @PostCode = 'AA1 1AA',
         @Country = 'United Kingdom',
         @OrganisationName = 'OrgName',
         @OrganisationDomain = 'orgName.com'

CreateUser存储过程:

CREATE PROCEDURE [dbo].[CreateUser]
    @Title NVARCHAR(50),
    @FirstName NVARCHAR(50), 
    @LastName NVARCHAR(50), 
    @IdentityId UNIQUEIDENTIFIER, 
    @PhoneNumber NVARCHAR(50), 
    @MobileNumber NVARCHAR(50), 
    @StatesId INT, 
    @AddressLineOne NVARCHAR(MAX),
    @AddressLineTwo NVARCHAR(MAX),
    @Town NVARCHAR(50),
    @County NVARCHAR(50),
    @PostCode NVARCHAR(10),
    @Country NVARCHAR(20),
    @OrganisationName NVARCHAR(MAX),
    @OrganisationDomain NVARCHAR(MAX)
AS
    INSERT INTO Addresses (AddressLineOne, AddressLineTwo, Town, County, PostCode, Country)
    VALUES (@AddressLineOne, @AddressLineTwo, @Town, @County, @PostCode, @Country)

    INSERT INTO Organisations(Name, Domain, AddressId)
    VALUES (@OrganisationName, @OrganisationDomain, SCOPE_IDENTITY())

    INSERT INTO Users (Title, FirstName, LastName, IdentityId, MobileNumber, PhoneNumber, OrganisationId, StatesId, DateCreated)
    VALUES (@Title, @FirstName, @LastName, @IdentityId, @PhoneNumber, @MobileNumber, SCOPE_IDENTITY(), @StatesId, GETDATE())

【问题讨论】:

    标签: sql sql-server database stored-procedures uniqueidentifier


    【解决方案1】:

    将值设置为变量并使用它:

    declare @id uniqueidentifer;
    
    set @id = newid();
    
    exec . . .
         @IdentityId = @id,
         . . .;
    

    这里没有关于newid() 的具体内容。 exec 语句不解析表达式,甚至是简单的函数调用。

    同样,但 beginend 在存储过程主体周围。您应该始终这样做,以防止出现意外错误。

    【讨论】:

    • 谢谢戈登,这很有效。你能看看我的存储过程脚本,因为它不允许我使用 Scope_identity 来获取最后一条记录的 ID
    • SCOPE_IDEINTITY() 用于 IDENTITY 列,没有 UNIQUEIDENTIFIER 列。当使用 UNIQUEIDENTIFIER 作为键时,您应该为它们分配 DEFAULT,使用 NEWSEQUENTIALID() 生成它们并使用 OUTPUT 子句返回它们。
    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多