这个T-SQL存储过程写对了吗?

Is this T-SQL stored procedure written correctly?

我是 SQL 服务器和 T-SQL 的新手,但我确实有一些在 MS Access 中构建应用程序的经验。

当我从应用程序中执行此存储过程时它运行良好,但是当我在 SSMS 中调试它时,出现错误

Unable to Step. Invalid Operation.

但它可以让我逐步完成。根据我的研究,我似乎正在创造一个竞争条件,但我无法正确解决这个问题。我也很感激任何建议来优化这个或解决任何明显的问题。

代码的作用:

此代码用于将新客户输入数据库。第一个 select 语句查找现有 ID。如果 ID 为空,它将添加一个新客户。如果 ID 不为空,则不会添加客户。第二个 IF 语句在插入这些值之前检查 @pName2@pName3 是否为空。

这是我的代码:

    @pUID nvarchar(16) = null, 
    @pName1 nvarchar(50) = null,
    @pName2 nvarchar(50) = null,
    @pName3 nvarchar(50) = null,
    @pAddress1 nvarchar(30) = null,
    @pAddress2 nvarchar(30) = null,
    @pAddress3 nvarchar(30) = null,
    @pZipCode nvarchar(30) = null
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ID INT
    SELECT @ID = ID FROM tblCustomer WHERE strUID = @pUID

    IF @ID IS NULL
    BEGIN 
        DECLARE @Customer_ID INT

        INSERT INTO tblCustomer(strUID, strName)
        VALUES(@pUID, @pName1)

        SET @Customer_ID = @@IDENTITY

        IF (@pName2 <> '') OR (@pName3 <> '')
        BEGIN
            INSERT INTO tblSecondaryCustomer(CustomerID, strName2, strName3)
            VALUES(@Customer_ID, @pName2, @pName3)
        END

        INSERT INTO tblAddress(CustomerID, strAddress1, strAddress2, strAddress3, strZipCode)
        VALUES(@Customer_ID, @pAddress1, @pAddress2, @pAddress3, @pZipCode)
    END
END

尝试用以下内容替换您的 IF 语句:

IF NOT EXISTS(SELECT ID FROM tblCustomer WHERE strUID = @pUID)

除了检查是否存在之外,您似乎没有使用@ID...并且您可以使用 ISNULL 函数来确保涵盖 NULL 个案例...

IF (ISNULL(@pName2,'') <> '') OR (ISNULL(@pName3,'') <> '')

HTH

戴夫